MySql中B-Tree索引和Hash索引

在MySQL中索引是在存储引擎层实现的,而不是在服务器层实现的。所以,不一样的存储引擎实现也是不一样的。<br>mysql

B-Tree索引:<br> Innodb引擎使用B+Tree实现<br> MyISAM使用前缀压缩技术使得索引更小,InnoDb按照原数据格式进行存储。<br>sql

MyISAM索引经过数据的物理位置引用被索引的行,而InnoDB根据主键引用被索引的行。<br>服务器

B-Tree索引可以加快数据的访问速度,由于存储引擎不须要全表扫描来获取须要的数据,而是从索引的根节点开始进行搜索,跟节点的槽中存放了指向子节点的指针,存储引擎根据指针向下层查找,这些节点定义了子节点的上限和下限;<br>数据结构

B-Tree索引列是顺序组织的,因此很适合查找范围数据,像“找出I到K开头的名字”,查询效率很是高。<br>函数

B-Tree索引适用于全值匹配、匹配最左前缀、匹配列前缀、匹配范围值、精确匹配某一列而且范围匹配另外一列、只访问索引的查询。<br>优化

由于B-Tree索引树中的节点是有顺序的,因此索引还能够用于order by操做。指针

B-Tree索引的限制:<br>code

  1. 若是不是按照索引的最左列开始查找,则没法使用索引。<br>
  2. 没法跳过索引中的列。<br>
  3. 若是查询中有范围查询,其右边全部的列都没法使用索引优化查找。例如:<br> where last_name = 'Smith' and first_name like 'J%' and birth = '1990-11-12'只能使用索引的前两列,第二列中有like是范围查询,后边的列没法使用索引。

所以,索引列的顺序很是重要!!!<br>排序

Hash索引:<br> Hash索引是基于Hash表实现的,只有精确匹配的查找才能有效。对于每一行数据,存储引擎对全部的索引列计算一个Hash码,不一样的建值计算出来的Hash码不同,Hash索引将全部的Hash码存储在索引中,同时在索引中保存指向每一个数据行的指针。<br> 例如:对fname创建hash索引<br>索引

mysql> select * from testhash;
fname lname
Jack Lentz
Tom James
Kobe Zaitsev
Vadim Tkachenko

假设该索引使用Hash函数f(),返回下面的值<br>

f('Jack') = 2233<br> f('Tom') = 6890<br> f('Kobe') = 5678<br> f('Vadim') = 9881<br>

在Hash槽中有以下数据结构<br>

槽(Slot) 值(value)
2233 第一行数据
5678 第三行数据
6890 第二行数据
9881 第四行数据

在Hash槽是有序存储的,可是数据行是无序的。<br>

mysql> select lname from testhash where fname = 'Kobe'

MySql存储引擎先计算Kobe的hash值,而且找到对应记录的指针,而后找到第三行的值,比较是否为Kobe,确保就是要查找的行。<br> Hash索引的限制:<br>

Hash索引不是按照索引值的顺序存储的,所以不能用于order by排序。

Hash索引不支持匹配查找。

Hash索引不支持任何的范围查找。

当出现Hash冲突时,存储引擎必须遍历全部行的指针,逐行比较。

索引的优势:<br>

  1. 大大减小服务器须要扫描的数据量<br>

  2. 帮助服务器避免排序和临时表的建立<br>

  3. 索引可以把随机IO变为顺序IO

相关文章
相关标签/搜索