概念:
索引列爲一列的情況,即新建索引的語句只實施在一列上的話,就是指單一索引。用戶可以在多個列上建立索引,這種索引叫做複合索引(組合索引)。複合索引的創建方法與創建單一索引的方法完全一樣。但複合索引在數據庫操作期間所需的開銷更小,可以代替多個單一索引。當表的行數遠遠大於索引鍵的數目時,使用這種方式可以明顯加快表的查詢速度。
同時有兩個概念叫做窄索引和寬索引,窄索引是指索引列爲1-2列的索引,如果不特殊說明的話一般是指單一索引。寬索引也就是索引列超過2列的索引。
設計索引的一個重要原則就是能用窄索引不用寬索引,因爲窄索引往往比組合索引更有效。擁有更多的窄索引,將給優化程序提供更多的選擇餘地,這通常有助於提高性能。
複合索引應用示例:
某遊戲社區要顯示用戶動態,select * from userfeed where uid=$uid order by lastlogin desc limit 0,30; 初期默認以uid爲索引字段, 查詢爲命中所有uid=$uid的結果按照lastlogin排序。 當用戶行爲非常頻繁時,該SQL索引命中影響結果集有數百乃至數千條記錄。查詢效率超過0.01秒,併發較大時數據庫壓力較大。
解決方案:將索引改爲 uid+lastlogin 複合索引,索引直接命中影響結果集30條,查詢效率提高了10倍,平均在0.001秒,數據庫壓力驟降。
小貼士:
數據索引的存儲是有序的,在有序的情況下,通過索引查詢一個數據是無需遍歷索引記錄的,極端情況下,數據索引的查詢效率爲二分法查詢效率,趨近於 log2(N)。