最近看了關於索引設計的三星索引,這裏加上自己的白話總結一下。。
三星索引顧名思義是有三顆星
select id, name, sex, age, score from user where sex='b' and score=80 order by age;
第一顆星/窄索引片
把查詢中的等值謂詞取出來放在前面。(儘量的窄索引,使掃描的數據行儘量少)
在上面的sql語句中,第一顆星應取出的就是sex和score。
第二顆星/避免排序
把語句中order by後的取出。(避免排序,儘量減少磁盤的讀取)
在上面的sql語句中,第二顆星應取出的就是age。
第三顆星/寬索引
把查詢中所有需要查詢的列取出。(避免每一行索引都要單獨去聚簇索引進行隨機IO查詢)
在上面的sql語句中,取出的應該是id, name, sex, age, score,但sex、score、age已取出,故應只取id和name。
不一定每次都能達到完美的三星索引
select id, name, sex, age, score from user where sex='b' and score between 80 and 90 order by age;
在這個sql語句中,由於score是範圍查詢,如果按(sex, score, age, id, name)設計的話,就不能滿足第二顆星了,因爲在按第一顆星那樣找出滿足sex=‘b’,還要對score進行範圍匹配的話,age就無序了;如果按(sex, age, score, id, name)設計的話,則不能滿足第一顆星,因爲sex是寬索引片。故在設計時需要權衡滿足第一顆星犧牲第二顆星較好還是滿足第二顆星滿足第一顆星較好。第三顆星的話倒是很容易實現的。