在《高性能MySQL》中文第三版提到了索引的評估:三星評估(three-star system)。性能
在《High Performance MySQL (3rd Edition)》英文第三版的原文是:ui
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.spa
這段話理解起來很費解,第三版的中文翻譯也很差理解:翻譯
索引將相關的記錄放到一塊兒得到一星;orm
若是索引中的數據順序和查找中的排列順序一致得到兩星;索引
若是索引中的列包含了查詢中須要的所有列則得到三星;three
我的表示中文和英文都很理解(難道語文和英語都是數學老師教的,^...^)。ci
我對此提出了深深的疑問:數學
一星:相關的記錄指的是什麼??(相關這個詞很深奧,「相關部門」是什麼部門)it
二星:若是創建了B-Tree(B+Tree)索引,數據就有序了。
三星:索引的列包含了查詢須要全部的列?根本不須要在where查詢條件全部的列上創建索引!
我認爲一星和二星的rows應該是columns,索引不關具體的數據行,只與查詢的列有關。這樣也與High Performance MySQL 後面提到的多列索引的觀點相符合,特別是二星評估。
我的的觀點:
評估一個索引是否適合某個查詢的「三星系統」(three-start system):
一星:索引將相關的列放到一塊兒,即在一系必要的列上創建索引,沒必要爲在where條件裏面的列都創建索引。
二星:索引中的數據列順序和查找中排列順序一致。一般將選擇性最高的列放到索引的最前列。
三星:索引中的列包含了查詢中須要的所有列。索引包含查詢所須要的數據列,再也不進行全表查表(聚簇索引、覆蓋索引)。
參考資料:
《高性能MySQL》中文第三版
《High Performance MySQL (3rd Edition)》英文第三版