1. 程式人生 > >Mysql索引優化2

Mysql索引優化2

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