實際工作中,總是避免全表掃描,於是針對慢sql
中的一些欄位上建立索引。
建立索引的意義,即本來在表中掃描和運算的操作,放在了索引中去執行,減少表的掃描行數,所以加快了查詢速度。
但單純的在每個欄位上建立索引,並不一定達到預期的效果,看下面的sql
:
select avg( score ) from table where group = A;
上面的sql
的目的,是要查詢A
分組的平均分數。於是在group
、score
上分別建立兩個索引。
它先用 group
索引到表中查詢出所有 group=A
的行,建立臨時表,將查詢結果放進臨時表,緊接著在臨時表中進行運算。結果是仍然掃描了大量的行數,並且建立臨時表的開銷是比較大的,實際上score
索引已經沒有意義了。
於是針對這條 sql
的優化是失敗的,正確的索引是建立group
和score
的聯合索引,這意味了查詢完全不用回表,直接在索引中查詢返回了結果。
但仍需注意聯合索引的順序,group
在前,score
在後。
本作品採用《CC 協議》,轉載必須註明作者和本文連結