在创建索引的时候有一个三星索引,这是我看《数据库索引设计与优化》这本书上看到的,姑且在此卖弄一下:
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将不会作为我们所设定的索引来起作用,因为在数据库优化器中,范围条件为该组合索引的最后一个匹配列,后边的列都为非匹配列。