zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

索引答疑篇

2023-04-18 16:07:37 时间

1.索引列的数据长度能少则少。 说明:为了减少我们简历B+树时候关键字的重量,让结点可以存放更多数据

2.索引一定不是越多越好,越全越好,一定是建合适的。 我们建立索引需要空间开销,而且对数据修改时候可能还需要在底层数据结构中分裂和重组结点进行维护,所以索引建立一定要合适.

3.匹配列前缀可用到索引like 9999%,like%9999%、like%9999用不到索引;

  • 一般情况下like 9999%可以用到索引(先找9开头再找9开头,再.....),因为它满足一个前缀搜索,但不绝对.有的时候like 9999%这种是用不到索引的,因为可能存在些许多相同前缀,然后我们匹配时候不知道找啥,所以预期可以使用到索引的,我们这里可能真实情况没有使用到.选择性一般差
  • like%9999 like %9999%必然用不到,因为%可以为任意,我们压根不知道用索引从哪找,选择性太差

4.Where条件中not in和<> (不等于号)操作无法使用索引; 无法使用索引,原理同样是选择性很差,索引不知道往哪里走

5.匹配范围值,order by也可用到索引;

6.多用指定列查询,只返回自己想到的数据列,少用select *

  • 如果直接select对应的列,可以用到覆盖索引,而用*不可以
  • select * 影响的是sql server最终把数据发给你的时候的总时间,并不影响查询的计算过程。
  • 不需要的字段会增加数据传输的时间,即使mysql服务器和客户端是在同一台机器上,使用的协议还是tcp,通信也是需要额外的时间。
  1. 联合索引中如果不是按照索引最左列开始查找,无法使用索引; 这个很明显把,大概原因是因为最左匹配原则(原理是联合索引建立索引的顺序时候要从左到右建立),,详细部分之前我文章里有,请自行查看啦

8.联合索引中精确匹配最左前列并 范围()匹配另外一列可以用到索引;

9.联合索引中如果查询中有某个列的范围查询(大于小于等等),则其右边的所有列都无法使用索引; 直接举例了,(age,name)联合索引. age>16 and name ="zyh",age可以精确定位,但是name用不到联合索引 为啥呢?你想想我们这里age用了索引把age指向了大于16的数据区,但是我们的name完全有可能在age 小于区也有啊,所以name没法用到索引