zoukankan      html  css  js  c++  java
  • B-Tree索引的学习记录

    本文摘自高性能MYSQL

    假设有如下数据库:

    CREATE TABLE People(
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    dob DATE NOT NULL,
    gender ENUM('m','f') NOT NULL, KEY(last_name,first_name,dob)
    );

    B-Tree索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于根据最左前缀的查找。

    全值匹配:

    全值匹配指的是和索引中的所有列进行匹配,例如前面提到的索引可用于查找姓名为Cuba Allen、出生于1960-01-01的人

    匹配最左前缀:

    只根据last_name查找,即只使用索引的第一列

    匹配列前缀:

    只匹配某一列的值的开头部分,例如前面的索引可用于查找所有以J开头的人

    匹配范围值:

    例如前面提到的索引可用于查找姓在Allen和Barrymore之间的人,这里也只使用了索引的第一列。

    精确匹配某一列并范围匹配另外一列:

    前面提到的索引也可以用于查找姓为Allen,并且名字是字母K开头的人,即第一列全匹配,第二列范围匹配。

    因为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查询中的ORDER BY 操作。一般来说,如果B-Tree可以按照某种方式查找到值,那么也可以按照这种方式用于排序。所以,如果ORDER BY 字句满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求。

    下面是一些关于B-Tree索引的限制:

    • 如果不是按照索引的最左列开始查找,则无法使用索引。例如上面的索引无法用于查找名字为Bill的人,也无法查找某个特定生日的人,因为这两列都不是最左数据列。类似地,也无法查找姓氏以某个字母结尾的人。
    • 不能跳过索引中的列。也就是说,前面所述的索引无法用于查找姓为Smith并且在某个特定日期出生的人。如果不指定名(first_name),则mysql只能使用索引的第一列。
    • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询。例如有查询 WHERE last_name="Smith" AND first_name LIKE 'J%' AND dob="1976-12-23",这个查询只能使用索引的前两列。


  • 相关阅读:
    【UVA–11997 K Smallest Sums 】
    【LA 3027 Corporative Network】
    【bzoj3173-最长上升子序列-一题两解】
    【Rain in ACStar HDU-3340】
    【Uva 11280 飞到弗雷德里顿】
    【Uva 10269 马里奥与公主的归途】
    【Uva 11604 编码都有歧义了】
    【RevolC FaeLoN Uva 10972】
    oracle解析xml(增加对9i版本的支持)
    acl操作记录
  • 原文地址:https://www.cnblogs.com/alphathink/p/10857723.html
Copyright © 2011-2022 走看看