MySQL索引概念小记

  • 索引是存储引擎用于快速找到记录的一种数据结构
  • 索引可以包含一个列或多个列的值,多个列的话,顺序很关键。
  • 大多数索引使用的是B-Tree数据结构,InnoDB则使用的是B+Tree(属于B-Tree变种)。
  • B-Tree意味着所有值是按顺序存储的,而且每一个叶子节点到根的距离相同。

DEMO:key(last_name, first_name, dod)

可以使用B-Tree索引的查询类型

  1. 全值匹配
    • 指和索引所有列均进行匹配
  2. 匹配最左前缀
    • 只使用索引的第一列
  3. 匹配列前缀
    • 是匹配开头部分,如last_name like L%匹配L开头的name字段
  4. 匹配范围值
    • 查找last_name在Allen和Barry之间的数据,属于匹配范围
  5. 精准匹配某一列并范围匹配另外一列
    • 精准匹配的列需要在索引中比范围匹配的列要靠前,last_name为Allen,frist_name以字母K开头。
  6. 覆盖索引
    • 查询的内容列都在索引中,查询仅仅需要访问索引,无需访问数据行

B-Tree索引的限制

  1. 如果不是按照索引的最左列开始查找,则无法使用索引
    • 例如DEMO中,无法查找first_name为Bill的人,也无法查找特定生日(dod)的人,因为这两列都不是索引的最左列;同理,无法查找last_name以某个字母结尾的人
  2. 不能跳过索引中的列
    • DEMO中,无法查找last_name=Allen并且特定日期出生的人,没有指定first_name则只能使用到索引的last_name
  3. 如果查询中有某个列的范围查询,则其右边的列就无法使用索引优化查找
    • DEMO中,查询where last_name = 'bla' and first_name like 'J%' and dod = '2019-12-12',这个查询只能用到索引的前两列,因为这里like是一个范围条件 ,如果范围查询的列值有限,建议可以通过使用多个等于条件来代替范围查询,这样就可以用到索引里的多列了

你可能感兴趣的:(MySQL索引概念小记)