MySQL索引相关原则

2021-05-10  本文已影响0人  有点蒙圈

索引创建原则

模糊查询请最好遵守最左前缀查询原则。

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

上一篇下一篇

猜你喜欢

热点阅读