索引优化策略
什么情况下不会用到索引
索引选择性太差
<> not in 无法使用
is null 会使用,is not null 不会使用索引
where 子句跳过左侧列,直接使用右侧列
对索引计算或者使用函数
使用索引优化排序
当排序出现了索引左侧列,则允许使用索引排序
左侧字段单字段排序时,索引支持升降序
多字段情况下,左侧字段必须是升序,且顺序不允许打乱
多表关联优化
嵌套循环关联 Nested Loop Join
驱动表越少越好
外键上加索引,条件上加索引
EXPLAIN 参数
id select 序列号,多表关联情况下 id=1 就是驱动表
select_type
simple 最普通查询
derived 包含在from 子句中的子查询
union
union result : union 计算结果 会产生临时表 没有索引
subquery 在select出现的子查询
primary 复杂查询中最外层的select
type 表示关联类型或访问类型,即MySQL决定如何查找表中的行。
ALL
const
ref
eq_ref
rang
index
ref_or_null
possible_keys 显示查询可能使用那些索引来查找
key 显示mysql实际采用哪个索引来优化对表的访问
key_len 在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
ref 显示在key列记录的索引中,表查找值所用到的列或常量
row 估计预读并检测的行数
filtered 百分比 ,代表 (rows * filtered )/100 ,这个结果将于前表产生交互
extra
using index 使用到了索引