標籤:
在《高效能MySQL》中文第三版提到了索引的評估:三星評估(three-star system)。
在《High Performance MySQL (3rd Edition)》英文第三版的原文是:
Lahdenmaki and Leach’s book also introduces a three-star system for grading how suitable an index is for a query.
The index earns one star if it places relevant rows adjacent to each other,
a second star if its rows are sorted in the order the query needs,
and a final star if it contains all the columns needed for the query.
這段話理解起來很費解,第三版的中文翻譯也不好理解:
索引將相關的記錄放到一起獲得一星;
如果索引中的資料順序和尋找中的排列順序一致獲得兩星;
如果索引中的列包含了查詢中需要的全部列則獲得三星;
個人表示中文和英文都很理解(難道語文和英語都是數學老師教的,^...^)。
我對此提出了深深的疑問:
一星:相關的記錄指的是什嗎??(相關這個詞很深奧,“相關部門”是什麼部門)
二星:如果建立了B-Tree(B+Tree)索引,資料就有序了。
三星:索引的列包含了查詢需要所有的列?根本不需要在where查詢條件所有的列上建立索引!
我認為一星和二星的rows應該是columns,索引不關具體的資料行,只與查詢的列有關。這樣也與High Performance MySQL 後面提到的多列索引的觀點相符合,特別是二星評估。
個人的觀點:
評估一個索引是否適合某個查詢的“三星系統”(three-start system):
一星:索引將相關的列放到一起,即在一系必要的列上建立索引,不必為在where條件裡面的列都建立索引。
二星:索引中的資料列順序和尋找中排列順序一致。通常將選擇性最高的列放到索引的最前列。
三星:索引中的列包含了查詢中需要的全部列。索引包含查詢所需要的資料列,不再進行全表查表(聚簇索引、覆蓋索引)。
參考資料:
《高效能MySQL》中文第三版
《High Performance MySQL (3rd Edition)》英文第三版
MySQL索引的三星評估(three-star system)