MySQL中字元串的自動重複數據刪除(規範化)
varchar
問題是 MySQL 是否可以透明地為字元串使用單獨的物理儲存,但具有適用於%
.我的 MySQL 數據庫中有大量重複的字元串:例如,許多客戶的名字相同。為了節省空間,特別是在索引中,從而加快查詢速度,我寧願只物理儲存一個 ID 並將實際字元串儲存在其他地方:而不是
varchar(30)
s| Mary | Smith | New York | | Mary | Cooper | Chicago | | John | Cooper | New York |
我只想儲存
int
s| 1 | 2 | 3 | | 1 | 4 | 5 | | 6 | 4 | 3 |
其中 ID 指的是字元串:
| 1 | Mary | | 2 | Smith | | 3 | New York |
我可以手動完成並使用
join
s 在每個查詢中的字元串和 ID 之間進行映射,但我的問題是欄位是否有任何屬性可以告訴 MySQL 為我透明地處理它,以便在查詢中我使用表操作好像它包含字元串但字元串的底層物理儲存是分開的?
select
在我的情況下,數據庫很少(如果有的話)更新但經常讀取,查詢相當複雜和緩慢,所以我需要優化update
.
MySQL 沒有這樣的功能。
為了避免不得不更新多個點和/或為了節省空間,留給使用者“規範化”數據。
在您的範例中,使用名字/姓氏通常是不切實際的。但是對於“位置”可能是可取的。
重複名稱(例如)是不切實際的,因為回報很差。當“Mary”坐在其他地方時,程式碼必須隱式(當您抵押時)或顯式(通過 JOIN)到達字元串。在大型數據集中,這可能會導致額外的磁碟命中——代價高昂。此外,“瑪麗”是 4 個字元;first_name_id 可能是 a
MEDIUMINT UNSIGNED
,即 3 個字節——節省不多。對於重複很多的較大字元串(公司名稱),權衡可能會更好。“規範化”的主要目的是將事物放在一個位置。在談論公司的系統中,公司名稱應該只拼寫一次。取而代之的是一個 id —— 可能是一個整數,也可能是一個股票程式碼(如在股票數據庫中)。當公司更名時,只需要改變一個地方。(如果程式碼發生變化,就像 AOL 發生的那樣,那麼程式碼就會很混亂。)