造成MySQL全表扫描的原因

简介:
+关注继续查看

全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。通常在数据库中,对无索引的表进行查询一般称为全表扫描;然而有时候我们即便添加了索引,但当我们的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
目录
相关文章
|
5天前
|
关系型数据库 MySQL Unix
PHP MySql 安装与连接
PHP MySql 安装与连接
55 0
|
11天前
|
存储 关系型数据库 MySQL
|
11天前
|
关系型数据库 MySQL 数据库
树莓派mysql的安装
树莓派mysql的安装
|
12天前
|
关系型数据库 MySQL 数据安全/隐私保护
mysql解压缩版安装和卸载
mysql解压缩版安装和卸载
17 0
|
16天前
|
SQL 关系型数据库 MySQL
云端MySQL的安装及应用
本场景介绍Linux下MySQL的安装部署及数据库表的增删改查操作。
20 0
|
8月前
|
存储 SQL 关系型数据库
mysql创建的索引不生效,查询数据仍是全表扫描?
mysql创建的索引不生效,查询数据仍是全表扫描?
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(三)
|
存储 SQL 关系型数据库
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
130 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
推荐文章
更多