我需要將未知數據類型保存到字段。因此,我不得不使用VARCHAR而不是整數(因爲數據也可以是一個字符串)mysql性能<, > for varchar vs整數
id, filter1, filter2
1, male, 24
2, female, 53
在這種情況下,過濾器1是性別和過濾器2的年齡。如果我查詢有沒有很大的性能影響:
SELECT * FROM tbl WHERE filter2 > 30
與使用整數相比?
我需要將未知數據類型保存到字段。因此,我不得不使用VARCHAR而不是整數(因爲數據也可以是一個字符串)mysql性能<, > for varchar vs整數
id, filter1, filter2
1, male, 24
2, female, 53
在這種情況下,過濾器1是性別和過濾器2的年齡。如果我查詢有沒有很大的性能影響:
SELECT * FROM tbl WHERE filter2 > 30
與使用整數相比?
如果你寫:
where filter > 30
那麼MySQL會做你想要什麼 - 但你可能會得到奇怪的結果。如果您有一個值爲'44x'
的列,那麼它也會被篩選器選中。爲什麼?因爲MySQL會將filter
轉換爲字符串。另外,類型轉換通常排除使用索引。
如果使用字符串:
where filter > '30'
那麼你不必字符串轉換問題,但你會得到所有以字母開頭的字符串。
換句話說,不要混合這樣的類型。值應該存儲在它們的本地類型中。您應該重新訪問您的數據模型 - 您可能需要一個名爲age
的專欄(或更好的是,出生日期)。
不幸的是,我不知道過濾器是什麼。客戶可以自己定義它們。所以我不知道這是一個字符串還是數字。我目前唯一的限制是最多有5個過濾器(即我的表格中有5列:filter1 ... filter5) – Chris
你的問題的開頭句子表明你沒有把足夠的思想放到你的應用程序中。 –
這取決於很多可能因您而定的因素。最好的做法是簡單地自己測試一下。這並不困難。我在索引列上測試了900萬行MyISAM表,我發現varchar看起來有點慢,但沒有太多。 –
@DanBracuk不幸的是,這是一個遺留系統,我不得不重新設計。這就是我發佈這個問題的原因。我目前正在審查數據庫設計 – Chris