Mysql索引優化2
阿新 • • 發佈:2018-03-18
convert div ive mys exp 就會 解釋 sam pla
理想的索引
- 查詢頻繁
- 區分度高
- 長度小
- 盡量能覆蓋常用查詢字段
索引與排序
- 對於覆蓋索引,直接在索引上查詢時,就是有順序的,using index
- 在innodb引擎中,沿著索引字段排序自然是有序的
- 在myisam引擎中,沿著索引字段排序,但取出來的字段有非索引字段,並不是索引->回行,索引->回行,而是一次性取出所有數據,再進行排序,explain這樣的sql語句時,extra中就會出現using filesort
- 要想辦法避免filesort,盡可能的利用索引來排序
- where a > 3 order by b 假設a列和b列都是獨立索引,這樣的sql explain中也會有using filesort, 因為a,b都是獨立索引,在查詢中只能用到a對應的索引,order by b時無法使用索引
Explain解釋
- select type字段
- simple (不含子查詢)
- primary(含有子查詢或派生查詢)
- subquery (非from子查詢)
- derived (from型子查詢)
- union
- union result
- type字段 分析查詢的關鍵字段
- all < index < range < ref < eq_ref < (const, system, null)
- all 全表掃描
- index 掃描索引樹上全部的索引節點
- range 根據索引做範圍的掃描
- ref 通過索引列,直接引用到某些數據行
- eq_ref 通過索引列,直接引用一行數據,常用於連接中
- 一般按照主鍵查詢時,易出現const, system 當查詢不經過表時會出現null
- table字段
- 真實的表名
- 臨時表 如as tmp
- derived 如from型子查詢
- null 不使用表
- ref字段
- 連接查詢時,表之間字段的引用關系
- possible key字段
- 可能使用的索引
- key 字段
- 最終使用的索引
- key len 字段
- 實際使用索引的長度
- rows 字段
- 估計要掃描多少行
- extra 字段
- using index 用到了索引覆蓋
- using where 光靠索引定位不了,還得where判斷一下
- using temporary 用到了臨時表,效果已經非常不好了
- using filesort 文件排序,可能在磁盤,也可能在內存中
Mysql索引優化2