【数据库】索引

 参考:

https://mp.weixin.qq.com/s?__biz=MzI1MDU0MTc2MQ==&mid=2247484338&idx=1&sn=f753421c70f0e436c040af9e969c3331&chksm=e981e01cdef6690ae6e4bec7c92b436019f5f30e02f35524ca8e144a92b8aa743fc2c51d2c27#rd  用好MySQL索引,你必须知道的一些事情(极力推荐)

https://blog.csdn.net/xlgen157387/article/details/79572598    为什么你创建的数据库索引没有生效,索引失效的条件!

https://segmentfault.com/a/1190000021464570                     一张图搞懂MySQL的索引失效


 

 

 

 索引的存储格式

 索引就是一棵B+树,每创建一个索引都需要创建一棵B+树,每一棵B+树的节点都是一个数据页,每一个数据页默认会占用16KB的磁盘空间,每一棵B+树又会包含许许多多的数据页。叶子节点包含真正数据

 

索引类型:

Hash索引:基于哈希表实现。哈希索引通过Hash算法(直接定址法、平方取中法、折叠法、除数取余法、随机数法)将数据库的索引列数据转换成定长的哈希码作为key,将这条数据的行的地址作为value一并存入Hash表的对应位置。

在MySQL中,只有Memeory引擎显式的支持哈希索引,

聚集和非聚集索引:不同存储引擎,myISAM,InnoDB

联合索引:

  最左匹配原则,遇到范围会停止查找

  https://www.cnblogs.com/rjzheng/p/12557314.html     按不同where场景掌握联合索引使用和执行原理

  如下对属性 (a,b)建立联合索引:a全局有序,字段b全局无序,局部有序,  所以如果仅根据b来过滤则无法使用联合索引

  而执行a > 1 and b = 2时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这个范围内b值不是有序的,因此b字段用不上索引。

  

联合索引测试: 参考 https://blog.csdn.net/xlgen157387/article/details/79572598

 

索引覆盖:

索引下推: 

问题:回表:

 

什么时候索引会失效?

创建索引原则

 


 

索引不生效问题

1、如何判断数据库索引是否生效 -- explain分析

     

   table:顾名思义,显示这一行的数据是关于哪张表的;

  type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为:const、eq_reg、ref、range、indexhe和ALL;

  possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从where语句中选择一个合适的语句;

  key: 实际使用的索引。如果为NULL,则没有使用索引。少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在Select语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引;

  key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好;

  ref:显示索引的哪一列被使用了,如果可能的话,是一个常数;

  rows:MySQL认为必须检查的用来返回请求数据的行数;

  Extra:关于MySQL如何解析查询的额外信息。

 

posted @ 2021-10-15 09:58  飞翔在天  阅读(37)  评论(0编辑  收藏  举报