InnoDB索引

InnoDB索引

InnoDB的索引主要分为两大类一个是聚集索引,一个是普通索引。

聚集索引

InnoDB聚集索引的的叶子结点存储行记录,因此,InnoDB必须要有且只有一个聚集索引

  • 如果表定义了主键,则主键就是聚集索引
  • 如果表没有定义主键,则第一个not null unique列就是聚集索引
  • 最后,InnoDB会创建一个隐藏的row_id作为聚集索引

普通索引

InnoDB普通索引的叶子节点存储主键值。通常情况下需要扫码两遍索引树。

为什么不存储指针而是储存主键值

当数据需要更新的时候,二级索引不需要修改,只需要修改聚集索引,一个表只能有一个聚簇索引,其他的都是二级索引,这样只需要聚簇索引,不需要重建二级索引

explain中重要的列

  • id 查询中select表的顺序
  • type 访问的类型

    • ALL 全表扫描
    • index 索引扫描
    • range 范围扫描
    • ref 非唯一索引扫描
    • eq_ref 唯一索引扫描
    • const 常数
  • table 该语句查询的表
  • possible_keys 该查询语句,可能走的索引
  • key 实际使用的索引
  • rows 扫描的行数
  • extra

    • using where 使用where筛选
    • using temprorary 使用临时表
    • using filesort 使用文件排序

索引失效

  • like查询已 ‘%…’开头,以’xxx%’结尾会继续使用索引
  • where语句中使用 <>和 !=。 因为二级索引储存的是主键值,所以失效。对于主键索引还是会使用的

    • or 操作
    • 索引列存在计算或使用函数
    • 联合索引中没有按顺序,或者中间缺失了。
    • 隐式转换

以上情况如果需要查询的列,可以直接索引在索引中得到,那么还是会使用索引的。(覆盖索引)没有使用索引的大部分情况是因为InnoDB普通索引的叶子节点存储主键值,通常情况下需要扫码两遍索引树。

你可能感兴趣的:(mysql)