在創建索引的時候有一個三星索引,這是我看《數據庫索引設計與優化》這本書上看到的,姑且在此賣弄一下:
SELECT ARTICLE_ID,SUMMARY_NUM,REVIEW_NUM,FORWARD_NUM,COLLECTION_NUM FROM article_num_summary WHERE ARTICLE_ID = '10000' AND REVIEW_NUM=0 ORDER BY SUMMARY_NUM;
一星的定義:WHERE 條件等值作為組合索引最開頭的列。一星的索引(ARTICLE_ID,REVIEW_NUM)或(REVIEW_NUM,ARTICLE_ID);
二星定義:將ORDER BY 列加入索引,這樣的話,數據會在索引中排序好,避免數據庫在訪問表的時候再進行排序。二星索引 (ARTICLE_ID,REVIEW_NUM,SUMMARY_NUM)或(REVIEW_NUM,ARTICLE_ID,SUMMARY_NUM);
三星定義:將查詢語句中剩余的列加入到索引中,這樣只查詢索引,不會訪問表。三星索引:(ARTICLE_ID,REVIEW_NUM,SUMMARY_NUM,FORWARD_NUM,COLLECTION_NUM)或(REVIEW_NUM,ARTICLE_ID,SUMMARY_NUM,FORWARD_NUM,COLLECTION_NUM);
在此只討論等值條件(等值條件下都可以稱為匹配列),范圍條件(>,<,between 等)不包括在此;
如果在查詢語句中有范圍條件。
例:SELECT ARTICLE_ID,SUMMARY_NUM,REVIEW_NUM,FORWARD_NUM,COLLECTION_NUM FROM article_num_summary WHERE ARTICLE_ID = '10000' AND FORWARD_NUM > 5 AND REVIEW_NUM=0 ORDER BY SUMMARY_NUM;假設我們的索引為:(ARTICLE_ID,FORWARD_NUM,REVIEW_NUM),實際上因為FORWARD_NUM條件為范圍,實際起作用的索引為(ARTICLE_ID,FORWARD_NUM)也就是說REVIEW_NUM將不會作為我們所設定的索引來起作用,因為在數據庫優化器中,范圍條件為該組合索引的最后一個匹配列,后邊的列都為非匹配列。