2017-03-01 125 views
1

我想在數據庫中進行一些索引優化。Mysql:varchar上的部分索引

我看到有關於字段VARCHAR 32的指數,在VARCHAR 100

的領域例如VARCHAR 32索引包含的ID(也許用戶ID或什麼,這樣字符串60c487df-38e8-1c79 -da00-561799874092),varchar 100包含以pluto或pippo爲例的短字符串。 (我知道,這個字段必須縮小)

第一個問題)對於這些字段,刪除索引並創建一個部分索引是否正確?

例如,將varchar 32的索引大小減小到第8個字符,幫助mysql查找行更快? (分析較小的指數)。 有沒有缺點?

第二個問題)Field x varchar 100有一個完整索引(不是部分),當我用x =「pippo」添加一行時,mysql是如何工作的? Mysql是否會爲該列的索引填充(或保留)所有100個字節?

在此先感謝。

回答

2

我懷疑是否有理由進一步「優化」您的索引。 減少索引字段的大小,減小索引的大小。但是,除非您處於內存受限的環境中,否則會增加不必要的複雜性。

部分索引不會讓MySQL「更快找到一行」。只比較前8個字節不足以找到一行,所以MySQL將不得不做更多的工作來找到給定的行。

varchar()數據類型是變長長度字符字段。這意味着它僅將數據存儲在字符串中,並在第一或第二字節中加上一個長度。無論這些值是在表格中還是在索引中,都是如此。

您應該保留您擁有的索引,並尋找其他方式來優化您的系統 - 如果性能問題。

+0

如果我使用完整的索引我36 varchar字段,我有18個在一百萬臺行的基數,如果我使用部分指數的基數是一樣的,它的內容是一個UUID,但非主鍵,在相關表格中是uuid。就我而言,前8個字符幾乎不會等於另一行的前8個字符。 不小的索引能幫助mysql更快地掃描結果嗎? – theex

+1

掃描兩行(而不是一行)的成本高於索引尺寸的一半。 –

1
  • 前綴索引只會有幫助,因爲索引會更小。但是,如果這很重要,你會失去獨特性。通常前綴索引是無用的;謹防。
  • UUID的固定長度爲36個字符,而不是32個,也不是100.
  • 由於您有Type 1 UUID,因此您可以重新排列這些位以使它們按時間順序排列,從而可能提供更好的「參考位置」。請參閱以下鏈接。
  • 將36個字符打包爲16個字節將節省一堆空間。這導致更好的緩存能力(特別是對於大型表),因此速度更快。請參閱鏈接。

Link

+0

是的,36個字符,而不是32個。 這個uuid字段在一個相關的表中,我不需要唯一性,因爲它不是唯一的,是關係1中的N:N 字段varchar 100不是一個uuid,只是一個描述性字段,過大的比較到其內容。 謝謝 – theex