造成MySQL全表扫描的原因

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
11月前
|
存储 关系型数据库 MySQL
MySQL-索引优化篇(2)_使用索引扫描来优化排序
MySQL-索引优化篇(2)_使用索引扫描来优化排序
63 0
|
SQL 关系型数据库 MySQL
全表扫描导致mysql服务器的cpu飙升到100%
全表扫描导致mysql服务器的cpu飙升到100%
268 0
全表扫描导致mysql服务器的cpu飙升到100%
|
存储 SQL 关系型数据库
mysql创建的索引不生效,查询数据仍是全表扫描?
mysql创建的索引不生效,查询数据仍是全表扫描?
|
XML 关系型数据库 MySQL
实战-msf扫描靶机上mysql服务空密码
实战-msf扫描靶机上mysql服务空密码
实战-msf扫描靶机上mysql服务空密码
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
111 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
113 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
|
存储 SQL 关系型数据库
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
160 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
113 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
|
关系型数据库 MySQL 测试技术
|
MySQL 关系型数据库 索引
【转】MySQL松散索引扫描与紧凑索引扫描
在优化group by查询的时候,一般的会想到两个名词:松散索引扫描(Loose Index Scan)和紧凑索引扫描(Tight Index Scan),因为通过这两种索引扫描就可以高效快速弟完成group by操作。
1618 0