索引常用使用原则以及原理解析(明白这些你再也不需要去死记硬背索引使用原则了)

  • Post author:
  • Post category:其他


如上图所示,主键索引是排序的

普通索引是通过字段值进行排序,然后其data中存储的是主键值

1、索引不会包含null的列

因为在索引底层是依靠字段的值来进行构建索引的,所以对于一个值为null的索引,是不会放在索引中的,因此不可避免会进行全表扫描

2、尽量使用短列索引

因为对于较短的列在转化为ascll码时存储占用空间更小

3、索引值排序 如果where子句中已经使用了索引,那么后面的order by 索引是不会生效的

因为此数据库索引底层默认是排序的

4、like语句操作

不要使用“%xxx%” 以及 “%xxx”这样会导致索引不可用

原因:在索引结构中是通过匹配一级一级往下查找的,类似于字典目录,如果你连首字母都不知道,如何去查找字典?当你不知道首字母的情况下,唯一可以的情况就是你将26个字母全都查一遍,这样就会导致全表扫描,索引就会失效

5、不要在列上进行计算

索引失效的原因是索引是基于原键值的二叉树,将列值计算后,原来的二叉树就用不上了

像上面这样,mysql会很难判断sal*12中的哪个是你的字段,因为你的函数可能写的相当复杂

6、不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的

仔细思考发现,在索引底层,如果想要根据索引查找,那么首先你需要一个字段的值或者是范围,如果范围是not in 那就说明除了这几个字段的值,我都需要扫描,而索引查找的是需要查找的字段值,而不是不需要查找的字段值,因此,not in 是不能使用的索引的,会进行全表扫描。

同理,!=操作也不能。是由于,索引查找按照字段值查找时,根据字段值的ascll码值进行比较大小去进行查找,如果是不等于,你让我如何去进行比大小。例如,在1~10中去找查找所需要的,查找4时,通过二分法,我们只要两次就能查找到,这就是索引的威力。而如果你让我去查找一个不等于3的值,你告诉我,要如何查找?我需要将其它九个都找给你,那我还不如直接全表扫描去拿呢,这样还会更快,哼哼

7、索引要建立在经常select的字段上、

这是因为如果这些列很少用到,有无索引并不能明显改变查询速度,相反,由于增加了索引,反而降低了系统的维护速度和增大了对空间的需求

8、索引要建立在值比较唯一的字段上

因为在索引的底层是将值进行排序的,因此如果不唯一,还需要继续查找前后两个值与目标值的大小是否一致

9、最左索引优先原则

索引的字段值是捆绑在一起的,并且是联合索引的第一个在最前面,首先通过比较第一个,然后比较第二个,接着比较后面,就好比,你查询字典,先找首字母,再找第二个字母,接着找后面的,如果不给你提供首字母,让你查字典,首先如果你真的去做了,即使花费了你很大的力气(几乎要翻阅字典的每一页,等同于全表扫描),而且,你还会发现,你找到的是很多个??,然后你再从这些里面找到和你第一个首字母一致的那个单词!!



版权声明:本文为weixin_43727372原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。