2011-03-17 138 views
3

我有一張約1.2米行的桌子。它有6個索引列,包括一個包含url的varchar(255)字段。通過減少索引大小來提高MySQL性能?

我需要能夠掃描表以查看錶中是否存在網址,因此索引,但我想知道是否通過將索引大小減少到50左右來看到性能增益?

當然這意味着它可能必須在數據庫中搜索url時掃描更多的行......但我只需要每30秒進行一次這樣的查詢,所以我想知道是否較小的索引大小將是值得的。思考?

+1

我將首先使用mysql「explain」來確定您的查詢對每個索引的實際使用情況,然後開始檢查更改。如果它在搜索中使用varchar(255)索引,那麼很難找到速度更快的東西(索引應該提供近乎直接的訪問),這就是爲什麼在更改索引字段之前調查。 – Brandon 2011-03-17 00:50:30

+0

所有答案都被拒絕或零? – AbiusX 2011-03-17 14:47:31

回答

2

兩個原因降低也許更好 - (假設你的指數是非常有用的)

1)指標過於內存獲取加載,所以有可能是您的索引規模的增長在一定程度上罕見的可能性,這是不完全可在內存中緩存。那就是當你看到性能受到影響時(所有新的硬件規格......幾乎不可能有120萬行,但仍值得注意)。

2)很多時候,只有第一個'n'字符足以能夠快速識別每條記錄。你可能根本不需要索引整個255個字符。

兩個原因,你可能不關心 -

1)如前所述,你可能再也看不到你的指標日益成爲你的關鍵緩衝的,那麼,爲什麼擔心。

2)您需要確定第一個'n'個字符,甚至在此之後,性能將小於或等於一個完整的索引......不會更多。你真的需要花時間嗎?是否值得可能失去準確性?

-1

索引大小隻對磁盤空間很重要,所以你不會遇到嚴重的問題。

有或沒​​有索引可以基於您的CRUD操作,您有更多的選擇或更多插入/更新/刪除?

0

我懷疑你會看到任何改變索引只會使用前50個字符的差異。

由於這是一個VARCHAR列,索引值只會與每個URL一樣長,所以查看典型的URL,您可能只能爲每個URL約50個字符編制索引。

即使URL的長度都大得多,減小索引大小可能只會增加索引的那部分已經在內存中的機會,但是我再次懷疑您會注意到任何差異。如果音量很高,並且您需要啓動微優化以獲得更多性能,這可能只會有用。

3

從我SQL indexing tutorial (covers MySQL as well)

提示:始終致力於指數的原始數據。 這通常是您可以放入索引的最有用的 信息。

這是我建議的一般規則,直到有一個非常強的理由去做不同的事情。

在大多數情況下,空間不是問題。

表現明智,索引樹深度以索引葉節點的數量對數增長。這意味着,將索引尺寸減半可能不會減少樹深度。因此,性能增益可能僅限於提高緩存命中率。但是你提到你每30秒執行一次該查詢。在適度加載的機器上,這意味着您的索引不會被緩存(除了可能每隔30秒搜索一次相同的URL)。

畢竟:我沒有看到任何理由對上述一般建議採取行動。

如果您確實想要保存索引空間,請嘗試首先查找冗餘索引(例如,那些以相同列開頭的索引)。這些通常是低懸的成果。

+0

引用的提示很好。然而,您的性能分析僅查看索引查找,而忽略索引掃描 - 索引查找確實遵循日誌(大小) - 具有相當大的日誌基礎,但索引掃描的性能直接跟隨大小。所以,這取決於系統的主要作用。例如它是檢索單個記錄或例如排序的範圍。此外,檢索排序的範圍可能是較慢的操作,因此速度的感知會更加感受到它。 – Unreason 2011-03-17 11:13:26

+0

@非理由 - 是的。不幸的是,我們兩個都在做猜測,因爲實際的查詢沒有顯示出來。就我所瞭解的問題而言,每30秒只有一個查詢使用該索引。如果該查詢檢索許多記錄,則離開節點遍歷和表訪問會導致[slow index exerience](http://use-the-index-luke.com/sql/anatomy/slow-indexes),以便不使用該聲明的索引也可能成爲一種選擇。然而,所有的猜測都是。 – 2011-03-17 13:07:32

0

保留你的url的固定長度爲32的md5散列。

+1

這可能比平均URL大小更長。 – Alasdair 2013-05-27 02:51:45