造成MySQL全表扫描的原因

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。通常在数据库中,对无索引的表进行查询一般称为全表扫描;然而有时候我们即便添加了索引,但当我们的SQL语句写的不合理的时候也会造成全表扫描。
以下是经常会造成全表扫描的SQL语句及应对措施:

  1. 使用null做为判断条件
    如:select account from member where nickname = null;

建议在设计字段时尽量将字段的默认值设为0,改为select account where nickname = 0;

  1. 左模糊查询Like %XXX%
    如:select account from member where nickname like ‘%XXX%’ 或者 select account from member where nickname like ‘%XXX’

建议使用select account from member where nickname like ‘XXX%’,如果必须要用到做查询,需要评估对当前表全表扫描造成的后果; 刘加东@酷听说

  1. 使用or做为连接条件
    如:select account from member where id = 1 or id = 2;

建议使用union all,改为 select account from member where id = 1 union all select account from member where id = 2;

  1. 使用in时(not in)
    如:select account from member where id in (1,2,3)

如果是连续数据,可以改为select account where id between 1 and 3;当数据较少时也可以参考union用法;
或者:select account from member where id in (select accountid from department where id = 3 ),可以改为select account from member where id exsits (select accountid from department where id = 3)
not in 可以对应 not exists;
5.使用not in时
如select account where id not in (1,2,3)
6.使用!=或<>时
建议使用 <,<=,=,>,>=,between等;
7.对字段有操作时也会引起权标索引
如select account where salary * 0.8 = 1000 或者 select account where sustring(nickname,1,3) = ‘zhangxiaolong’;
8.使用count(*)时
如select count(*) from member;
建议使用select count(1) from member;
9.使用参数做为查询条件时
如select account from member where nickname = @name
由于SQL语句在编译执行时并不确定参数,这将无法通过索引进行数据查询,所以尽量避免; 刘加东@酷听说

当不规范的写法造成全表扫描时,会造成CPU和内存的额外消耗,甚至会导致服务器崩溃。在团队协作中难免会遇到一些初学者,除了安排合理的任务外,资深的工程师也要做好Code Review。否则当我们有海量数据时,不规范的语句会带来很严重的后果,一定要慎重、慎重。

此文转自Zebul博

文章链接为:https://blog.csdn.net/u012501054/article/details/80361447

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之假如mysql的binlog有很多个文件,按什么顺序扫描
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
SQL 关系型数据库 MySQL
全表扫描导致mysql服务器的cpu飙升到100%
全表扫描导致mysql服务器的cpu飙升到100%
584 0
全表扫描导致mysql服务器的cpu飙升到100%
|
存储 SQL 关系型数据库
mysql创建的索引不生效,查询数据仍是全表扫描?
mysql创建的索引不生效,查询数据仍是全表扫描?
1040 0
|
存储 关系型数据库 MySQL
MySQL-索引优化篇(2)_使用索引扫描来优化排序
MySQL-索引优化篇(2)_使用索引扫描来优化排序
161 0
|
XML 关系型数据库 MySQL
实战-msf扫描靶机上mysql服务空密码
实战-msf扫描靶机上mysql服务空密码
实战-msf扫描靶机上mysql服务空密码
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
189 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
214 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
|
存储 SQL 关系型数据库
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
258 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
194 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
|
关系型数据库 MySQL 测试技术

推荐镜像

更多