zoukankan      html  css  js  c++  java
  • Mysql中的Btree与Hash索引

    B-Tree 索引特征

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

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

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

    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级别条件的索引是不会被使用的。

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

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

    ... 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高;
          不能利用部分索引键查询;
  • 相关阅读:
    Resolving multicopy duplications de novo using polyploid phasing 用多倍体相位法解决多拷贝复制的新问题
    Efficient algorithms for polyploid haplotype phasing 多倍体单体型分型的有效算法
    PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类
    MicroRNA in Control of Gene Expression: An Overview of Nuclear Functions 微RNA控制基因表达:核功能概述
    点9图 Android设计中如何切图.9.png
    【Android开发经验】android:windowSoftInputMode属性具体解释
    Android存储路径你了解多少?
    Android 各种路径详细说明
    自定义Dialog的详细步骤(实现自定义样式一般原理)
    Android:图解四种启动模式 及 实际应用场景解说
  • 原文地址:https://www.cnblogs.com/sMKing/p/7573290.html
Copyright © 2011-2022 走看看