Mysql中的Btree与Hash索引

B-Tree 索引特征

B-Tree索引能够被用在像=,>,>=,<,<=和BETWEEN这些比较操做符上。并且还能够用于LIKE操做符,只要它的查询条件是一个不以通配符开头的常量。像下面的语句就可使用索引:mysql

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';算法

下面这两种状况不会使用索引:sql

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

第一条是由于它以通配符开头,第二条是由于没有使用常量。函数

假如你使用... LIKE '%string%'并且string超过三个字符,MYSQL使用Turbo Boyer-Moore algorithm算法来初始化查询表达式,而后用这个表达式来让查询更迅速。性能

一个这样的查询col_name IS NULL是可使用col_name的索引的。优化

任何一个没有覆盖全部WHERE中AND级别条件的索引是不会被使用的。spa

也就是说,要使用一个索引,这个索引中的第一列须要在每一个AND组中出现指针

下面的WHERE条件会使用索引:code

... WHERE index_part1=1 AND index_part2=2 AND other_column=3
    /* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2
    /* 优化成 "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5
    /* 可使用 index1 的索引可是不会使用 index2 和 index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

下面的WHERE条件不会使用索引:排序

    /* index_part1 没有被使用到 */
... WHERE index_part2=1 AND index_part3=2
   /* 索引 index 没有出如今每一个 where 子句中 */
... WHERE index=1 OR A=10
   /* 没有索引覆盖全部列 */
... WHERE index_part1=1 OR index_part2=10

有时候mysql不会使用索引,即便这个在可用的状况下。例如当mysql预估使用索引会读取大部分的行数据时。(在这种状况下,一次全表扫描可能比使用索引更快,由于它须要更少的检索)。然而,假如语句中使用LIMIT来限定返回的行数,mysql则会使用索引。由于当结果行数较少的状况下使用索引的效率会更高。

Hash 索引特征

Hash类型的索引有一些区别于以上所述的特征:

1.它们只能用于对等比较,例如=、in、<=>操做符(可是快不少)。它们不能被用于像<这样的范围查询条件。假如系统只须要使用像“键值对”的这样的存储结构,尽可能使用hash类型索引。
2.优化器不能用hash索引来为ORDER BY操做符加速。(这类索引不能被用于搜索下一个次序的值)
3.mysql不能判断出两个值之间有多少条数据(这须要使用范围查询操做符来决定使用哪一个索引)。假如你将一个MyISAM表转为一个依靠hash索引的MEMORY表,可能会影响一些语句(的性能)。
4.只有完整的键才能被用于搜索一行数据。(假如用B-tree索引,任何一个键的片断均可以用于查找。我以为可能意味着带通配符LIKE操做符会不起做用)。

5. Hash索引任什么时候候都不能避免表扫描 
Hash索引是将索引键经过Hash运算以后,将Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表中,因为不一样索引键存在相同Hash值,因此即便知足某个Hash键值的数据的记录条数,也没法从Hash索引中直接完成查询,仍是要经过访问表中的实际数据进行比较,并获得相应的结果。 

补充总结:
HASH索引:利用哈希函数,计算存储地址,检索时不须要像Btree那样,从根节点开始遍历,逐级查找。    
 优势: 查找效率高。
 局限:     
      仅仅知足=,in,<=>,查询, 不能范围查询(原先有序的键值通过哈希函数运算,可能再也不连续);
      没法用于排序操做(order by);
      当重复值时,效率并不比BTree高;
      不能利用部分索引键查询;
相关文章
相关标签/搜索