码迷,mamicode.com
首页 > 数据库 > 详细

about MySql Innodb Index

时间:2017-07-11 21:26:08      阅读:176      评论:0      收藏:0      [点我收藏+]

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

  1. 什么是索引
  索引是一种数据结构,通常是B-tree、Hash,它存储的是一个表中特定列(一列或多列)的值。它的用途是帮助数据库高效获取数据,快速的找到指定key对应的value或values。其本质就是通过映射来实现的快速查找,从而避免全表扫描。
  1. B+树是怎么回事
  B+树代表的是平衡树而不是二叉树,是MySql常用的索引类型,主要解决如何通过key快速的找到对应的数据,为磁盘或其它存取辅助设备设计的一种平衡查找树。
B+树是由二叉查找树、平稳二叉树、B树演化而来。B+树的高度一般为2到4,有效的减少了查找磁盘的次数。
通过上面文章的介绍可以看出,创建索引是有开销的。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

about MySql Innodb Index

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

原文地址:http://www.cnblogs.com/helloprogrammer/p/mysql-innodb-index.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!