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 一般索引的叶子节点 存储主键值,通常状况下须要扫码两遍索引树。