造成MySQL全表扫描的原因

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。通常在数据库中,对无索引的表进行查询一般称为全表扫描;然而有时候我们即便添加了索引,但当我们的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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之假如mysql的binlog有很多个文件,按什么顺序扫描
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 关系型数据库 MySQL
MySQL-索引优化篇(2)_使用索引扫描来优化排序
MySQL-索引优化篇(2)_使用索引扫描来优化排序
91 0
|
SQL 关系型数据库 MySQL
全表扫描导致mysql服务器的cpu飙升到100%
全表扫描导致mysql服务器的cpu飙升到100%
355 0
全表扫描导致mysql服务器的cpu飙升到100%
|
存储 SQL 关系型数据库
mysql创建的索引不生效,查询数据仍是全表扫描?
mysql创建的索引不生效,查询数据仍是全表扫描?
|
XML 关系型数据库 MySQL
实战-msf扫描靶机上mysql服务空密码
实战-msf扫描靶机上mysql服务空密码
实战-msf扫描靶机上mysql服务空密码
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
132 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
138 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
|
存储 SQL 关系型数据库
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
191 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
139 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
|
关系型数据库 MySQL 测试技术