我有一個MySQL表,除了其他屬性,還有一個時間戳,一個類型和一個user_id。
所有這些都可以搜索和/或排序。
爲每一個創建一個索引,還是使用全部三個或兩個創建單個複合索引更好?MySQL:使3個字段的複合索引,或使3個單獨的索引?
12
A
回答
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最終會做一個完整的表掃描來解決它。
相關問題
- 1. Python 3.x:使用第二個重複索引的索引
- 2. Rails 3 Postgres使用單個字段索引進行查詢,但不應該使用複合索引?
- 3. 索引一個3個整數字段的mysql表
- 4. 多個或單個複合索引
- 5. MySQL:哪個更好,單獨索引或相同索引?
- 6. iOS - 3個字符串的鍵索引
- 7. 具有多個字段或多個索引的索引
- 8. 3個索引或單個索引與2列在SQL Server 2008中?
- 9. MySQL索引結構:多個或單個索引?
- 10. MySQL使用多個索引的訂單
- 11. 具有多個字段的MySQL索引
- 12. MySQL:兩個布爾字段的索引
- 13. mysql字段索引
- 14. 單個索引與多個字段索引
- 15. 兩列上的單個非聚集索引或每列上的單獨索引?
- 16. 集裝箱用兩個索引(或複合索引)
- 17. 3個文本字段的唯一索引
- 18. mongodb複合或個別索引
- 19. 的MySQL索引鍵字段
- 20. IndexOutOfBoundsException:索引:3,大小:3
- 21. 使用tenant_id進行Mysql複合索引
- 22. 複合索引可用於搜索MongoDB中的單個字段嗎?
- 23. 哪個複合索引會使這個簡單的MySQL查詢更快?
- 24. MySQL中的兩個單列索引與一個兩列索引?
- 25. mysql複合索引thoery
- 26. 使用Mongo複合索引
- 27. 1維的索引或多個索引
- 28. 使用單個連續內存塊索引3維陣列
- 29. 使用索引查詢時1複合索引鍵和單獨索引鍵有什麼區別
- 30. 複合索引應該在哪裏使用兩個單獨的WHERE子句中的字段?
...並且對於諸如'select * from my_table where tstamp = @ ts1'這樣的查詢仍然有幫助。 – Unreason 2010-11-16 14:40:55
是的,它可能有助於查詢。但是不會像那個專欄上的僅索引**那樣有幫助。 – 2010-11-16 15:02:43
是的,實際上它只會像索引那樣有幫助。由於指數較大這一事實可能會較慢 - 但是,如果單列的指數是有用的(即,高選擇性),那麼複合索引將是有用的 - mysql可能會查看更大的索引,但btree索引被組織爲樹,所以增加大小,加上僅需要訪問樹的一部分的事實,再加上I/O操作發生在塊大小的事實轉化爲:具有相同起始列的索引對該列的條件同樣有幫助。 – Unreason 2010-11-16 15:22:35