当前位置:Gxlcms > 数据库问题 > about MySql Innodb Index

about MySql Innodb Index

时间:2021-07-01 10:21:17 帮助过:22人阅读

  索引是一种数据结构,通常是B-tree、Hash,它存储的是一个表中特定列(一列或多列)的值。它的用途是帮助数据库高效获取数据,快速的找到指定key对应的value或values。其本质就是通过映射来实现的快速查找,从而避免全表扫描。
  1. B+树是怎么回事
  B+树代表的是平衡树而不是二叉树,是MySql常用的索引类型,主要解决如何通过key快速的找到对应的数据,为磁盘或其它存取辅助设备设计的一种平衡查找树。 B+树是由二叉查找树、平稳二叉树、B树演化而来。B+树的高度一般为2到4,有效的减少了查找磁盘的次数。 B+树操作:https://yq.aliyun.com/articles/9280 通过上面文章的介绍可以看出,创建索引是有开销的。B+树为了维持平衡,随着数据的变化(增加、删除),B+树会进行分裂或合并,分裂或合并涉及到磁盘page页的操作,会有一定的开销。
  1. Hash索引
  hash索引由于其结构,所以在每次查询的时候直接一次到位,不像b-tree那样一点点的前进。所以hash索引的效率高于b-tree,但hash也有缺点,主要如下: (1)由于存放的是hash值,所以仅支持<=>以及in操作. (2)hash索引无法通过操作索引来排序,这是因为存放的时候经过hash计算,但是计算的hash值和存放的不一定相等,所以无法排序. (3)在组合所以里,无法对部分使用索引. (4)不能排序 Innodb中使用的自适应hash索引,是由存储引擎来执行,无法干预。
  1. 聚集索引
  聚集索引按照每张表的主键构造一棵B+树,叶子结点中包含了完整的数据记录,叶子结点也可以称之为数据页。聚集索引只能是主键,如果没有主键将找一个不包含null的唯一索引,如果再找不到数据库会自动创建一个隐藏的主键。  
  1. 普通索引(辅助索引)
  与聚集索引的区别是叶子结点不包含行记录的数据,除了本身的键值还包含一个书签(bookmark),就是行记录相应的主键。因此通过普通索引查询首先通过叶子结点找到符合记录的结果集,再通过主键索引找到一个完整的行记录。注意这里面不是指向行记录的指针,因为随着数据的变化,B+树会分裂或者合并,叶子结点的位置也会发生变化。  
  1. 最左原则是怎么回事
  联合索引是以元组的形式进行排序的,如(cityid,companyid)作为联合主键(索引)时,其叶子层的顺序可能是:(3,157),(3,158),(3,200),(5,34),(5,158),(7,90),可以看到是先按照cityid进行排序,然后再按照companyid排序,对于cityid来说是递增的,而对于companyid是无序的。   最左原则索引应用情况分支:
查询条件 索引情况  
where cityid = 3 应用索引  
where companyid = 158 不应用索引  
where cityid = 3 and companyid = 158 应用索引  
where companyid = 158 and cityid = 3 应用索引 执行计划会对此进行优化
 
  1. 覆盖索引
通过辅助索引就可以得到查询的记录,而不需要查询主键对应的行记录。优点包括:
  • 辅助索引不包括整行记录的所有信息,故其大小远小于聚集索引,减少IO操作
  • 辅助索引包含了所有信息,不用再通过主键查询行记录,减少IO操作
可以通过explain中的extra选项看出来是否走覆盖索引,如果有using index就是走的覆盖索引 对于上述的联合索引下面几个sql都走覆盖索引
  • select cityid,companyid from cc_table
  • select cityid,companyid from cc_table where companyid=158
  • select count(*) from cc_table where companyid=158
 
  1. 执行explain
https://segmentfault.com/a/1190000008131735

about MySql Innodb Index

标签:pac   平衡树   sql   div   plain   group   using   计划   而不是   

人气教程排行