BTREE与HASH的区别

对于 B-tree 和 hash 数据结构的理解可以有助于预测不一样存储引擎下使用不一样索引的查询性能的差别,尤为是那些容许你选择 B-tree 或者 hash 索引的内存存储引擎。html

 

B-Tree 索引的特色

B-tree 索引能够用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比较。若是 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可使用这种索引。好比,如下 SELECT 语句就使用索引:mysql

[sql]  view plain  copy
 
 print?
  1. SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';  
  2. SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';  


在第一个句子中,只会考虑 'Patrick' <= key_col < 'Patricl' 的记录。第二句中,则只会考虑 'Pat' <= key_col < 'Pau' 的记录。
如下 SELECT 语句不使用索引:算法

[sql]  view plain  copy
 
 print?
  1. SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';  
  2. SELECT * FROM tbl_name WHERE key_col LIKE other_col;  


第一句里面,LIKE 的值起始于一个通配符。在第二句里,LIKE 的值不是一个常量。
若是你这样使用: ... LIKE '%string%',其中的 string 不大于三个字符,MySql 将使用 Turbo Boyer-Moore 算法来对该字符串表达式进行初始化,并使用这种表达式来让查询更加迅速。
若是 col_name 列建立了索引,那么一个使用了 col_name IS NULL 的查询是可使用该索引的。
任何没有涵盖 WHERE 从句中全部 AND 级别的条件的索引将不会被使用。换句话讲,要想使用索引,该索引的前导列必须在每个 AND 组合中使用到。
如下 WHERE 从句使用索引:sql

[sql]  view plain  copy
 
 print?
  1. ... WHERE index_part1=1 AND index_part2=2 AND other_column=3  
  2.   
  3.   
  4.     /* index = 1 OR index = 2 */  
  5. ... WHERE index=1 OR A=10 AND index=2  
  6.   
  7.   
  8.     /* optimized like "index_part1='hello'" */  
  9. ... WHERE index_part1='hello' AND index_part3=5  
  10.   
  11.   
  12.     /* Can use index on index1 but not on index2 or index3 */  
  13. ... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;  


这些 WHERE 从句不使用索引:数据结构

[sql]  view plain  copy
 
 print?
  1. /* index_part1 is not used */  
  2. WHERE index_part2=1 AND index_part3=2  
  3.   
  4.   
  5. /*  Index is not used in both parts of the WHERE clause  */  
  6. WHERE index=1 OR A=10  
  7.   
  8.   
  9. /* No index spans all rows  */  
  10. WHERE index_part1=1 OR index_part2=10  

 

有时,即便有索引可使用,MySQL 也不使用任何索引。发生这种状况的场景之一就是优化器估算出使用该索引将要求 MySql 去访问这张表的绝大部分记录。这种状况下,一个表扫描可能更快,由于它要求更少许的查询。可是,若是这样的一个查询使用了 LIMIT 来检索只是少许的记录时,MySql 仍是会使用索引,由于它可以更快地找到这点记录并将其返回。性能

 

Hash 索引的特色

Hash 索引有着与刚才所讨论特色的相比大相径庭的特色:优化

  • Hash 索引只可以用于使用 = 或者 <=> 运算符的相等比较(可是速度更快)。Hash 索引不可以用于诸如 < 等用于查找一个范围值的比较运算符。依赖于这种单值查找的系统被称为 "键-值存储";对于这种系统,尽量地使用 hash 索引。
  • 优化器不可以使用 hash 索引来加速 ORDER BY 操做。这种类型的索引不可以用于按照顺序查找下一个条目。
  • MySql 没法使用 hash 索引估计两个值之间有多少行(这种状况由范围优化器来决定使用哪一个索引)。若是你将一张 MyISAM 或 InnoDB 表转换成一个 hash 索引的内存表时,一些查询可能会受此影响。
  • 查找某行记录必须进行全键匹配。而 B-tree 索引,任何该键的左前缀均可用以查找记录。

原文连接:http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.htmlspa

相关文章
相关标签/搜索