一、索引
二、索引语法
三、索引情况
四、索引优化
- 查看SQL语句的执行计划,查看该SQL语句有没有使用索引,有没有做全表扫描,获得可能被优化器考虑到的访问策略的细节,
- ID
- id相同,执行顺序由下而上(t2–>t3–>t1)
- id不同,如是子查询,id号会递增;id值越大则优先级越高越先执行(t3–>t1–>t2)
- - select_type
- SIMPLE 简单的select查询,查询中不包含子查询或者UNION
- PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
- SUBQUERY 在SELECT或WHERE列表中包含了子查询
- DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中
- UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
- UNION RESULT 从UNION表获取结果的SELECT
- type
最好到最差依次是:system > const > eq_ref > ref > range > index > all
all 全表扫描
非常暴力和原始的查找方法,非常的耗时而且低效,有很大的优化空间。
- S学校有俩万人,我告诉你你给我找到小明,然后你怎么做呢!你当然是把全校俩万人挨个找一遍,即使你很幸运第一个人便找到了小明,但是你仍然不能停下,因为你无法确认是否有另外一个小明存在,直到你把俩万人找完为止
index 按 照索引顺序 全表扫描
range 有范围的索引扫描
,相对于index的全索引扫描,它有范围限制,因此要优于index
ref_eq 结果集只有一个,使用主键或者唯一性索引进行查找的情况 精确查询,无需过多的扫描
- 比如根据学号查找某一学校的一名同学,在没有查找前我们就知道结果一定只有一个,所以当我们首次查找到这个学号,便立即停止了查询
const 将一个主键放置到where后面作为条件查询
,mysql优化器就把查询优化转化为一个常量。至于如何转化以及何时转化,这个取决于优化器
- possible_keys 可用能使用的索引,不一定被查询时使用
- key 列显示MySQL实际使用的索引;没有选择索引键是NULL
- key_len 索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度)
不损失精确性的情况下,长度越短越好 - rows 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数