使用聯合索引的一種情況

php_yt發表於2020-06-26

實際工作中,總是避免全表掃描,於是針對慢sql中的一些欄位上建立索引。

建立索引的意義,即本來在表中掃描和運算的操作,放在了索引中去執行,減少表的掃描行數,所以加快了查詢速度。

但單純的在每個欄位上建立索引,並不一定達到預期的效果,看下面的sql

select avg( score ) from table where group = A;

上面的sql的目的,是要查詢A分組的平均分數。於是在groupscore上分別建立兩個索引。

它先用 group 索引到表中查詢出所有 group=A的行,建立臨時表,將查詢結果放進臨時表,緊接著在臨時表中進行運算。結果是仍然掃描了大量的行數,並且建立臨時表的開銷是比較大的,實際上score索引已經沒有意義了。

於是針對這條 sql的優化是失敗的,正確的索引是建立groupscore的聯合索引,這意味了查詢完全不用回表,直接在索引中查詢返回了結果。

但仍需注意聯合索引的順序,group在前,score在後。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

簡潔略帶風騷

相關文章