復合索引的列順序判斷

2021-09-09 02:36:57 字數 1414 閱讀 8489

復合索引最令人困惑的當屬索引列的順序,不僅依賴於使用該索引的查詢,更需考慮排序和分組。

前段時候我發了個帖子:where條件順序和復合索引字段順序。感興趣的朋友不妨參與討論。

今天我提個自己的觀點。

在應用開發階段,【選擇性】是我們首要考慮因素,請看簡圖:

當出現sql效能問題時,你可能需要注意以下幾個:

1. 隨機io

2. 排序(order by)

3. 分組(group by or distinct)

這時不必也不應該在關注【選擇性】

我的經驗便是,在你手上已經有top n sql時,我們應該優先考慮【值的分布】,而不是選擇性。

那麼該如何判斷【值的分布】,我們通過一種被geek稱之為 【sarg】的方法,具體操作如下:

假如,我們有如下query:

[sql]view plain

copy

print?

select * from userresult_f where askid=800808 and uid=110996854;  

select * from userresult_f where askid=800808 and uid=110996854;
則有2個索引可供選擇:

1. idx_1 (askid,uid)

2. idx_2 (uid,askid)

是1 還是2 ?

利用【sarg】方法:

[sql]view plain

copy

print?

mysql> select sum(askid=800808),sum(uid=110996854) from userresult_f\g;  

*************************** 1. row ***************************  

sum(askid=800808): 6  

sum(uid=110996854): 2  

1 row in set (0.00 sec)  

mysql> select sum(askid=800808),sum(uid=110996854) from userresult_f\g;

*************************** 1. row ***************************

sum(askid=800808): 6

sum(uid=110996854): 2

1 row in set (0.00 sec)

依據查詢輸出,我們應該選擇 idx_2

by 資料牧羊人

good luck!

2014-4-27 19:05  於福州

復合索引 復合索引順序選擇問題

color red b 注意!在較高版本的oracle中不存在下述的問題!b color 復合索引第乙個原則 字首性 prefixing color red 復合索引的字首性是指只有當復合索引的第乙個字段出現在sql語句的謂詞條件中時,該索引才會被用到。如復合索引為 ename,job,mgr 只要...

MySQL復合索引前導列特性

在有些文章中也稱之為 索引的最佳左字首特性 叫什麼不重要,重要的是要理解他,會去運用他 柳峰老師 建立乙個復合索引 create index idx name salary dept on employee name,salary,dept 查詢資料 mysql explain select fro...

mysql(三)復合索引中列的順序怎麼選擇提供效能

現在我們有個查詢語句 select from pyment where staff id 2 and customer id 584 是應該建立乙個 staff id,customer id 索引還是應該顛倒一下順序。此時,有i乙個方法,我們可以看下staff id和customer id的全域性選...