2010-11-16 103 views

回答

8

巴勃羅的回答是正確的,但也許你不會意識到複合指數可能是合理的。

你可以有多個指標,並具有idx1(tstamp, user_id)不會有indx2(tstamp, type)idx1reverse(user_id, tstamp)等排除你......當他們涵蓋了所有的查詢條件

複合索引是最有用的,因此指數你建議將是最有用的

SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type 

如果你想提高這種查詢的性能,你可以考慮添加一個複合索引。

索引的缺點是它減慢了所有更新操作。然而,大多數通用應用程序會做更多的選擇,然後進行更新(無論是交易方式,即報表數量,特別是受影響/檢索的記錄數量),同時更容忍更慢的更新(用戶主要判斷速度該系統不是有必要更新記錄的時間,而是根據檢索記錄所需的時間;再次YMMV和有些應用程序不能按照這些規則進行播放)。

如果您有一些方法來測試典型工作負載的數據庫性能(創建一些典型的SQL腳本;獨立和可重複的,或在應用程序級別創建單元測試),然後您可以客觀地調整您的數據庫。

編輯 也意識到可以添加和刪除索引而不影響系統的功能。因此,您可以在實際使用系統的過程中稍後調整索引 - 通常您會收集並分析緩慢的SQL查詢,以查找可從添加索引中受益的條件。

7

如果您要單獨在這些字段上執行搜索,您可能需要單獨的索引才能使查詢運行得更快。

如果你有一個這樣的指標:

mysql> create index my_idx on my_table(tstamp, user_id, type); 

你查詢的是:

mysql> select * from my_table where type = 'A'; 

然後my_idx不會爲你的查詢有幫助和MySQL最終會做一個完整的表掃描來解決它。

+0

...並且對於諸如'select * from my_table where tstamp = @ ts1'這樣的查詢仍然有幫助。 – Unreason 2010-11-16 14:40:55

+0

是的,它可能有助於查詢。但是不會像那個專欄上的僅索引**那樣有幫助。 – 2010-11-16 15:02:43

+3

是的,實際上它只會像索引那樣有幫助。由於指數較大這一事實可能會較慢 - 但是,如果單列的指數是有用的(即,高選擇性),那麼複合索引將是有用的 - mysql可能會查看更大的索引,但btree索引被組織爲樹,所以增加大小,加上僅需要訪問樹的一部分的事實,再加上I/O操作發生在塊大小的事實轉化爲:具有相同起始列的索引對該列的條件同樣有幫助。 – Unreason 2010-11-16 15:22:35