我有許多帶有數百萬行的MySQL表。這些表用於存儲日誌行。 我在VARCHAR(50)中有一個字段「country」。這一欄有一個索引。 它會改變表現很多來存儲一個國家,而不是在這個國家領域的INT?VARCHAR或INT列的性能變化有多大 - MySQL
謝謝!
我有許多帶有數百萬行的MySQL表。這些表用於存儲日誌行。 我在VARCHAR(50)中有一個字段「country」。這一欄有一個索引。 它會改變表現很多來存儲一個國家,而不是在這個國家領域的INT?VARCHAR或INT列的性能變化有多大 - MySQL
謝謝!
你的問題比它看起來有點複雜。簡單的答案是Country
是一個最多50個字符的字符串。將其替換爲4字節的整數應該可以減少該字段所需的存儲空間。存儲量減少意味着處理查詢和較小索引時的I/O開銷較小。當然有異常情況。如果country
通常具有NULL
的值,那麼當前的存儲可能比具有ID的效率更高。
然而,當你考慮保持該領域是最新的時候,它會變得更復雜一些。與參考表格不同的是,這些國家現在是標準化的,而不是臨時名稱。一般來說,這是一件好事。另一方面,各國確實會隨着時間的推移而改變,所以你必須時刻準備增加「南蘇丹」或「東帝汶」。
如果您的數據庫在插入/更新方面很重要,那麼更改country字段需要在參考表中查找正確的值 - 並且可能會在其中插入新記錄。
我的意見是「天哪......將數據庫設置爲一開始就是個好主意」。此時,您需要了解維護國家/地區參考表時應用程序的效果,以獲得使數據結構更高效和更準確的性能提升。
是的,我知道所有對維護的影響,以及對磁盤的影響。我主要只關注表演!我想我會改變一切,即使這需要一點時間。即使性能增益很小,它仍然是一些東西! – user3017110
INT值上的索引顯示比應用於字符串數據類型(VARCHAR)上的索引更好的性能。 ,因爲搜索/匹配一個整數總是比一個字符串更快,並且在索引的下面實現的搜索算法以相同的原理工作。
在你的情況下,INT類型的索引比VARCHAR更好。
int總是1個字節。 varchar是numchars + 1個字節。所以是的,它可以對速度產生巨大影響 – exussum
@ user1281385:「int」不僅是1個字節。這將使其範圍僅從0到256,但通常是4個字節。 –
@juergend哎呀好點。答案仍然存在 – exussum