2010-04-26 66 views
7

我在MySQL Performance Blog上讀到,當表很大時,最好掃描整個表,而不是使用索引。對於大型數據庫,索引是好還是壞?

我有一張擁有數千萬行的表格。在進行查詢時,如果我不使用索引,那麼查詢比使用索引慢24倍。我知道很多事情可能會導致這種情況(例如,是否按順序存儲行),但是,請您給我一些提示,可能會發生什麼?或者我應該如何開始審查這個問題?我想最好使用索引時,瞭解當它不是

感謝

+1

即使沒有指標也無法呼吸! – 2010-04-26 07:54:47

+0

在你自己的數據庫上運行比較測試的好工作。當它達到性能時,測試總是會告訴哪種方式更快。 – phkahler 2010-04-27 13:51:01

回答

8

該文章說,在處理非常大的數據集時,如果需要使用的行數接近表中的行數,則使用索引可能會損害性能。

在這種情況下,只要您需要的數據多於索引中的數據,通過索引確實會損害性能。

要遍歷索引,數據庫引擎首先必須讀取索引表(它是一種表格)的大部分,然後從這個結果的每一行(或一組行)中,轉到真實表並開始挑選頁面來閱讀。

另一方面,如果您只需要檢索已經是索引表一部分的列,那麼數據庫引擎只需要讀取該列,而不是繼續到整個表以獲取更多數據。

如果您最終讀到的是大多數或接近大多數實際表格,處理索引所需的所有工作可能比開始進行全表掃描要花費更多的開銷。

現在,這是全部文章說。對於大多數處理數據庫的工作來說,使用索引是完全正確的事情。

例如,如果您需要提取一小組行,則通過索引而不是全表掃描的速度將會快很多。

在任何情況下,如果您有疑問,您應該執行一些性能分析以瞭解您的應用程序在不同類型的加載情況下的行爲,然後開始調整,不要將單個項目作爲銀色子彈爲了任何東西。

例如,加快文章中的pad列的示例查詢的一種方法是創建一個覆蓋valpad的單個索引,這樣計數將簡單地索引掃描,而不是索引掃描+表格查找,並且運行速度比全表掃描要快。

你最好的選擇是知道你的數據,並進行實驗,並知道你使用的工具是如何工作的,所以確實,瞭解更多關於索引的知識,但最終,你是誰決定什麼是最好的爲你的程序。

+1

正如文章所說:「即使你看1%或更少的行,全表掃描可能會更快。」所以不要跛腳,但答案似乎是「這取決於具體情況」。 – 2010-04-26 07:58:36

+0

是的,的確如此。 – 2010-04-26 08:00:44

1

這是很好的做法,把指數,你在WHERE子句使用的每一列。

2

一如既往,這取決於。到目前爲止,我從來沒有遇到如該博客文章中描述的情景。在我的查詢中使用索引對於大型(超過5000萬行)的索引要比在這些大型表上進行全表掃描要快100到10000倍。

這裏可能沒有銀彈,你必須測試你的特定數據和你的特定查詢。

相關問題