造成MySQL全表扫描的原因

全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。通常在数据库中,对无索引的表进行查询一般称为全表扫描;然而有时候我们即便添加了索引,但当我们的SQL语句写的不合理的时候也会造成全表扫描。
以下是经常会造成全表扫描的SQL语句及应对措施: 
1. 使用null做为判断条件 
如:select account from member where nickname = null; 
建议在设计字段时尽量将字段的默认值设为0,改为select account where nickname = 0; 
2. 左模糊查询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%’,如果必须要用到做查询,需要评估对当前表全表扫描造成的后果; 刘加东@酷听说 
3. 使用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; 
4. 使用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。否则当我们有海量数据时,不规范的语句会带来很严重的后果,一定要慎重、慎重。

此文转自

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

 

posted @   挑战者V  阅读(7127)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示