2011-06-22 103 views
2

我有一個關於索引的「最佳實踐」問題。mysql索引問題

我必須索引電話號碼,我通常將column設置爲整數。我可以把這個號碼分成多列:區號,後綴,前綴,國家代碼。但由於我必須考慮國際數據,而且某些國家/地區的數字有點滑稽,我寧願保留一列。

所以我的問題是,我應該保留列數據保存爲整數,字符或varchars? 我會去掉任何非int相關的東西,所以varchar可能不需要。

我必須爲我的客戶提供搜索功能,因此我需要索引號碼。 如果所有的電話號碼都來自美國,那麼我會分開列,但我也迎合國際。

所以我很好奇索引部分和其他人在這個舞臺上的做法。用整數(對於這樣的事情)索引是最好的,還是它很重要。

作爲一個側面說明,電話號碼將不會是所有長度相同。這就是爲什麼我會詢問如何格式化char或varchar中的列結構。

謝謝你們!

+1

我認爲保持它作爲varchar更有意義,因爲它將空間要求保持在最低限度。然後,您可以在完整列上索引,也可以只索引幾個初始字符。但我認爲電話號碼索引無論如何都無濟於事,因爲所有(或幾乎所有)條目都有唯一的電話號碼。 – Abhay

+0

如果您要在WHERE子句中(或在聯接中)使用電話號碼,則需要爲其編制索引,尤其是在電話號碼對每行都是唯一的情況下。 – Rafe

回答

2

表格預計有多大?我問的原因是,整數的索引顯然會變小,但在一張小桌子上,這不是主要考慮因素。使用varchar可以更靈活地執行諸如「... WHERE phonenumber like'415%'等等的操作,代價是一個更大的索引。如果表格非常大,並且它運行的盒子全部是內存 - 您可能會遇到索引不符合內存條件的情況,您可以根據索引將查詢發送到swap地獄,這可以通過您選擇的存儲引擎加劇:InnoDB在每個索引前加上主鍵,例如,可臃腫的索引,如果你的PK是在廣泛的領域或多個領域。

+0

我實際上有幾個數據庫的電話號碼。而我見過的最大的是大約5M的數字。當然,這些數字不會有太多重複,但該區域有許多重複的區域碼和前綴。這有助於搜索特定區域。 – coffeemonitor

1

電話號碼可以包括#和*,所以我會建議不要使用整數。
也是國際前綴是+這是爲了支持國際前綴無論你在哪個國家。

例如在南非,您需要在國家代碼前加09;在歐洲,前綴是00
爲了使數字在任何地方都能正常工作,請用+替換國際前綴,並且您的手機將使用本地前綴替代此號碼以撥打國外。

我會使用一個varchar的電話號碼。

此外,我會使用一個整數auto_increment作爲主鍵,並使用電話號碼作爲輔助鍵,以保持在InnoDB snappy上的性能。
還記得人們可以'分享'一個電話號碼,所以它不能保證是唯一的。