一 索引的原理和效率
原理: 索引是对常用字段建立指针列表(指针为数据记录存储的物理地址),减少磁盘I/O,并使用树结构存储这些指针来提升查找效率.
效率: 顺序查找的时间复杂度为O(N),二分查找的时间复杂度为O(log2N),块查找(索引)的效率介于二者之间.
举个例子,对于100万行不同记录的表,顺序查找的平均比较次数为50万次(N/2),而二分查找的为20次(实际略多一些),效率提升极大.
二 通过EXPLAIN查看执行计划, 检查索引是否被正确使用
方法: EXPLAIN sql语句
会得到如下的执行计划
主要参数的解释如下:
type: 连接使用了何种类型, 效率从高到低 const > eq_reg > ref > range > index > ALL
const 为常数级, 为使用唯一键或主键时(等于=)
eq_reg 为范围使用主键或唯一索引时(范围in,如果使用不等比较,需要为开区间或半开区间, 不可使用<=的闭区间,否则为ALL)
ref 为严格使用索引时(等于=, 多列索引时从第一个索引字段开始按建索引的顺序使用,这是由于索引使用树结构的缘故,分支查找不可逆)
range 为范围时用索引时(范围使用方法同eq_reg)
index 为索引扫描(多列索引时未从第一个索引字段开始)
ALL 没有用到索引,类似顺序查找
possible_keys: 可能应用的索引
key: 实际用到的索引
key_len: 索引长度,越短越好
ref: 索引的字段是如何被使用的,一般为常量const
rows: 所扫的行数