开发者学堂课程【MySQL 高级应用 - 索引和锁:索引优化答疑补充和总结口诀】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8621
索引优化答疑补充和总结口诀
目录:
一、索引优化答疑补充
二、优化总结口诀
一、索引优化答疑补充
假设 index(a,b,c)
Where语句 |
索引是否被使用 |
where a= 3 |
Y,使用到 a |
where a=3and b=5 |
Y,使用到 a,b |
where a= 3 and b=5andc=4 |
Y,使用到 a,b,c |
where b=3 或者 where b=3andc=4 或者 where c=4 |
N |
where a=3andc=5 |
使用到 a,但是 c 不可以, b 中间断了 |
where a= 3and b> 4andc=5 |
使用到 a 和 b,c 不能用在范围之后, b 断了 |
where a= 3 and b like 'kk%' and c= 4 |
Y,使用到 a,b,c |
where a= 3 and b like "%kk' andc=4 |
Y,只用到 a |
where a= 3 and b like '%kk%' andc= 4 |
Y,只用到 a |
where a= 3 and b like '"k%kk%' andc= 4 |
Y,使用到 a,b,c |
1.单列索引还是多列索引?
由于 mysql 只能用到你所有建立的索引中的唯一一个最优索引,所以如果建立多个单列索引,其实效率并不会高(虽然 mysql5.x 以上的版本,会在查询时,做索引合并的优化,但仍不建议这么做)
2.索引可以优化查询,那么索引真的越多越好吗?
由于 mysql 的索引是表的数据的一部分,就像你手中的汉语词典一样,目录越庞大,可读性越差(查询性能越差)。而且,在 insert,update,delete 时,都要额外维护索引的成本,建立过多的索引可能意味着更差的写性能。
3.如何优化查询?
(1)尽可能的让查询走索引,查询条件尽量避免出现 or
(2)范围查询, col like '%xxx%'模糊查询,会导致范围|模糊查询 之后的条件索引失效
(3)子查询使用关联查询替代
(4)关联查询,用小表驱动大表
(5)学会使用 limit,limit 会让你的查询提前返回需要的行,这点在排序的时候尤其有用(避免全部排序,只排序需要的列)
(6)在多租户的系统里,千万别漏掉 tenant_id 这个辨识度最高的列( tenant_id 建议放在最左边)
二、优化总结口诀
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效:
LIKE 百分写最右,覆盖索引不写星:
不等空值还有 or,索引失效要少用;
VAR 引号不可丢,SQL 高级也不难!