2011-03-26 17 views
65

最近我學會了索引的奇蹟,並且性能有了顯着的提高。然而,據我所知,我似乎無法找到這個問題的答案。MySQL - 爲什麼不索引每個字段?

索引非常好,但爲什麼不能只索引所有字段來使表格變得非常快?我確信有一個很好的理由不這樣做,但是如何在三場場表中的三個場地? 10在30場?人們應該在哪裏畫線,爲什麼?

+5

嘗試插入一個值超過10K條目索引表中的一個表,所有條目必須得到更新,因爲插入/刪除,這是一個巨大的時間開銷,並且如果每個值都有一個索引,會帶來一定的內存開銷 – 2011-03-27 01:08:35

+3

除了空間和寫入性能還有一個原因:使用[多個索引對單個表訪問效率非常低](http: //use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-combine-performance)。這意味着即使您在每列中都有一個索引,如果在WHERE子句中訪問多個列,選擇性能也不是很好。在這種情況下,多列索引是最好的。 – 2011-04-09 19:05:36

回答

75

索引佔用內存空間(RAM);索引太多或太大,數據庫將不得不將它們交換到磁盤。它們還增加了插入和刪除時間(每個索引都必須更新,以插入/刪除/更新每一條數據)。

你沒有無限的記憶。讓所有索引適合RAM =好。

你沒有無限的時間。只索引需要索引的列最大限度地減少插入/刪除/更新性能命中。

+0

給出一般理解的好的臨時答案,但實際上確定在索引上畫線的位置沒有多大幫助。你怎麼知道?只需將它們添加到常見的所有領域,並希望獲得最佳? – Andrew 2017-07-12 15:34:59

5

您必須平衡CRUD需求。寫入表格變得緩慢。至於繪製線的位置,取決於數據的處理方式(排序過濾等)。

+0

並且每個索引還需要一些數據庫空間 – Acanthus 2011-03-26 23:33:25

+0

@Acanthus:可用的最小硬盤驅動器數量是**千兆字節**。 – 2011-03-26 23:39:10

+2

@OMG,但不像Brian指出的那樣。這是**從來沒有**一個好主意,存儲超過你的需要。 RAM中的數據/索引緩存,備份媒體(適合每個磁帶的版本等)都受到無用索引的影響 – RichardTheKiwi 2011-03-27 00:17:44

14

請記住,更新,插入或刪除行時,必須更新每個索引。因此,您擁有的索引越多,寫入操作的性能就會越慢。另外,每個索引佔用更多的磁盤空間和內存空間(被調用時),所以它也可能會延緩讀取操作(對於大型表)。 Check this out

+4

鏈接用於* MS SQL Server *;這個問題是針對** MySQL ** – 2011-03-26 23:38:15

+2

@OMG鏈接中的大多數點都適用於所有主要的RDBMS – RichardTheKiwi 2011-03-27 00:16:25

+1

@Richard aka cyberkiwi:索引不被ANSI覆蓋 - 每個供應商都使用類似的術語,這是一個奇蹟。但即使如此,只有SQL Server和MySQL使用術語「聚集」和「非聚集」索引 - 這意味着在SQL Server比MySQL更多。沒有什麼可以保證對一個供應商的建議應該適用於另一個供應商。 – 2011-03-27 02:38:06

0

索引將佔用驅動器和內存的更多分配空間,但也會提高性能。不幸的是,當它達到內存限制時,系統將放棄驅動器空間並冒着性能風險。實際上,您不應將任何您認爲不涉及的字段編入任何數據遍歷算法中,既不插入也不搜索(WHERE子句)。但如果不是這樣,你應該這樣默認情況下,你必須索引所有字段。你應該考慮unindexing的領域是否只有主持人使用查詢,除非他們需要速度太

相關問題