在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
所以,索引列的顺序很是重要!!!<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>
大大减小服务器须要扫描的数据量<br>
帮助服务器避免排序和临时表的建立<br>
索引可以把随机IO变为顺序IO