优化口诀:
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
Like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!
“全值匹配我最爱”
“带头大哥不能死”,火车头可以单独跑,车厢不能单独跑
“最左前缀要遵守”,组合索引:name,Age,Pos,但是只有当最左侧的name存在时,索引才有效
“中间兄弟不能断”
Type=ref 绝对用到了索引
Possible_keys=idx_staffs_nameAgePos 可能用到了索引
Key = idx_staffs_nameAgePos 实际上用到的索引
但是是全职匹配的部分使用,因为如果用到了索引中的两个,key_len应该等于78,ref应该等于const,const
“范围之后全失效”,范围只能用到一部分排序,而不能用到查找
尽量使用覆盖索引,减少select *
在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
Is null ,is not null 也无法使用索引
百分like加右边
少用or,否则索引失效
索引最好怎么建的怎么用,这样避免mysql底层翻译和转换
字符串不加单引号索引失效
数据库会把2000隐式的自动的转换为String类型,但是在索引列上做任何操作(计算,函数,(自动or手动)类型转换),会使索引失效
问题:如何解决like‘%字符串%’时索引不被使用的方法?
答:使用覆盖索引,建的索引和查的字段个数顺序最好完全一致