MySQL索引相关原则
索引创建原则
模糊查询请最好遵守最左前缀查询原则。
a.mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。
b.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
c.综合a b补充:停止匹配并不代表范围查询后面的字段就无法使用索引了。比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整
避免为"大字段"建立索引
就是尽量使用数据量小的字段作为索引。因为MySQL在维护索引的时候是会将字段值一起维护的,那这样必然会导致索引占用更多的空间,另外在排序的时候需要花费更多的时间去对比。
选择区分度大的列作为索引
a.因为MySQL他还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。惯用的百分比界线是"30%"。
b.SELECT COUNT(DISTINCT last_name)/COUNT(*)FROM people;进行计算辨识度,一般来讲0.846即可
尽量为ORDER BY 和 GROUP BY 后面的字段建立索引
a.将 Order By后面的字段建立索引,这样在查询的时候就不需要再去做一次排序了,因为我们都已经知道了建立索引之后在B+树中的记录都是排序好的。
b.因为在GROUP BY 的时候也要先根据 GROUP BY 后面的字段排序,然后在执行聚合操作。如果 GROUP BY 后面的字段没有排序,那么这个时候MySQL是需要先进行排序的,这样就会产生临时表,一个排好序的临时表,然后再在临时表中执行聚合操作,这样子当然效率很低了,如果 GROUP BY 后面的字段已经建立了索引,那么MySQL 就不需要再去排序,也就不会产生临时表。
c.如果 GROUP BY的列和 ORDER BY的列不一样,即使都有索引也会产生临时表.
不要在条件中使用函数
a.如果是已经建立好的索引的字段在使用的时候执行了函数操作,那么这个索引就使用不到了。因为MySQL为该索引维护的B+树就是基于该字段原始数据的,如果正在使用过程中加了函数,MySQL就不会认为这个是原来的字段,那肯定不会走索引了。比如:from_unixtime(create_time) = ’2014-05-29’就应该改成create_time = unix_timestamp(’2014-05-29’)。
b.如果存在确实要使用函数的情况,可以直接对函数增加所以
不要建立太多的索引
因为MySQL维护索引是需要空间和耗费性能的,MySQL会为每个索引字段维护一颗B+树。
频繁增删改的字段不要建立索引
字段的变化MySQL是需要重新维护索引的。
索引失效的常见场景
1.使用 OR 关键字会导致索引失效,不过如果要想使用OR 又不想让索引失效,那就得需要为or条件中的每个列都建立索引。这很显然是和上面的不要建立太多的索引相违背。
2.联合索引如果不遵循最左前缀原则,那么索引也将失效
3.使用模糊查询的时候以%开头也会导致索引失效
4.索引列如果使用了隐式转换也会导致索引失效
示例:
假设字段 age 类型为 int,那我们一般是这么查询的
SELECT * FROM student WHERE age=15
上面这种情况是能使用到索引的,但是如果你这么写
SELECT * FROM student WHERE age='15'
那这种情况是使用不到索引的,也就是age列情的索引是失效的
参考原文:https://juejin.cn/post/6960470472077082638?utm_source=gold_browser_extension