Mysql SQL优化
SQL优化规则
第一条:
尽量全值匹配,也就是说尽量使用等于
第二条:
最佳左前缀原则
如果是复合索引,要遵守最佳左前缀原则,指的是从最左侧列开始并且不跳过索引中的列
如果是按顺序使用的索引列,且有最左侧的列,索引列完全有效
如果使用了最左侧的列中间跳过第二列或其他列接着使用,一旦跳过,之后的列索引不生效,俗称部分失效
如果没有使用最左侧的列,索引完全失效
第三条:
不在索引列上做任何操作
不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
第四条:
范围条件放在最后
中间有范围查询会导致后面的索引列全部失效,但是本身是有效的
第五条:
尽量使用覆盖索引
尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
第六条:
尽量不使用不等于
mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描
当然,如果使用了覆盖索引,索引还是可以用的,如果一定要使用不等于,尽量使用覆盖索引
第七条:
Null/Not Null有影响
注意null/not null对索引的可能影响
在字段为not null的情况下,使用is null 或 is not null 会导致索引失效
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name is not null
在字段为null或者未定义的情况下
Is not null 的情况会导致索引失效
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name is not null
第八条:
使用like的注意事项
like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name like '%july%'
第九条:
字符串类型加引号
字符串不加单引号索引失效
解决方式:请加引号【捂脸】
第十条:
OR改 UNION效率高
这个SQL还是贴出来吧,不然难理解
EXPLAIN
select * from staffs where name='July' or name = 'z3'
EXPLAIN
select * from staffs where name='July'
UNION
select * from staffs where name = 'z3'
解决方式:覆盖索引
EXPLAIN
select name,age from staffs where name='July' or name = 'z3'
总共十条,居然还有人写成了诗,墙都不扶,就服你
全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
LIKE百分写最右,覆盖索引不写*
不等空值还有OR,,索引影响要注意
字符引号不能丢,SQL优化有诀窍
听着还挺带劲
最后附上习题一部,不发答案,大家自己瞅瞅,可以答案写评论区,我是全猜对了,你呢
作者:彼岸舞
时间:2020\07\11
内容关于:Mysql
本文来源于网络,只做技术分享,一概不负任何责任
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」