2013-11-25 131 views
1

我有一個table ta int, b int, c int;複合index i (b, c)。我取了一些數據與下面的查詢:複合where子句的順序(MySQL,Postgres)

select * from t where c = 1 and b = 2; 

所以,問題是:會的MySQL和Postgres使用索引i?而且,更一般地說:查詢組合where子句順序是否會影響索引使用的可能性?

+0

使用EXPLAIN查看數據庫創建的查詢計劃。 –

+0

是的,你是對的。它工作方式不同。我正在刪除我的答案。感謝您的參考! – Mari

回答

1

你需要做的是在兩者中使用explain函數來看看發生了什麼。如果它說它使用索引,那麼它是。有一點需要注意的是,在一個數據量最小的小表中,很有可能postgresql(也可能是mysql)會忽略索引並支持掃描。爲了得到一個真實的結果,插入相當多的虛擬數據(至少20行,我總是做約500),並確保分析表。另外,要意識到如果搜索條件會返回很大比例的表結果,它也可能不會使用索引(因爲掃描速度會更快)。

  1. 創建表
  2. 生成數據(可能使用generate_series)
  3. 運行explain select * from t where c=1 and b=2
  4. 創建索引`上噸創建索引(B,C)
  5. 分析表analyze t
  6. 運行explain select * from t where c=1 and b=2和與首次比較

希望這將有助於回答這個問題以及將來可能會有的索引運行時的其他問題。要回答你的原始問題,是的,一般來說,postgresql將使用索引,不管順序如何,如果優化器確定這是獲得結果的最佳方式。記住要分析你的表,所以優化器會知道你的表中有什麼信息,並且在你的表中添加或刪除大量數據時分析它。根據您的PG版本和設置,這些可能會自動爲您完成,但手動分析並不會造成傷害,特別是在測試此類事情時。

編輯:索引順序可能會(特別是如果您不在查詢中使用順序並且優化程序使用索引)會影響查詢結果的順序 - 返回的行可能會在指數的相同順序。

1

不是,順序無關緊要。

Optimizer以最有效的方式執行很多智能事務來執行查詢。