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普通索引的叶子节点存储主键值,通常情况下需要扫码两遍索引树。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。