2012-01-26 52 views
1

如果我們有這樣的表:VARCHAR或文本 - MySQL的性能

create table x(
    id int primary key, 
    something_else_1 int, 
    something_else_2 int, 
    something_else_3 int, 

    char_data text, -- or varchar(1000) 
); 

此表將在除char_data所有字段進行查詢。

大多數查詢將類似於:

select id, something_else_1 
from x 
where something_else_2 = 2 and something_else_3 = 5; 

問題是 - 如果我們有索引,等等,

什麼樣的配置會更好 - 文本或varchar。

只是最後一個音符 -

我知道我可以分離到這兩個表,在這種情況下買的分離是不是最好的辦法,因爲除了斑點的所有字段將會像唯一索引或類似。

+1

相關:http://stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text http://stackoverflow.com/questions/3408930/does-anyone-have-considerable-proof-that- char-is-faster-than-varchar http://stackoverflow.com/questions/243252/how-much-more-inefficient-are-text-blobs-than-varchar-nvarchars –

+0

快速回答是varchar會更快,由於MySQL如何在內部處理TEXT/BLOB。在事情的宏偉計劃中,你不應該注意到巨大的表現處罰,或者 - 你不會,除非你真的非常忙碌的網站。 –

回答

2

此表格將在除char_data之外的所有字段上查詢。

隨後的char_data數據類型擁有性能沒有影響。只有當您選擇char_data時,它會消耗更多的帶寬。沒有其他的。

它不是問題。因爲你沒有在你的sql中使用。 SELECT *會變慢,但SELECT id, something_else_1不會變慢。 WHERE id=2 and something_else_2=1沒有效果,但是WHERE char_data like '%charsequence%'只要你不是用char_data搜索你的餐桌,你就是安全的
此外,如果您仍然希望按char_data進行搜索,則應啓用全文搜索。

ALTER TABLE `x` ADD FULLTEXT(`char_data`); 

注:全文搜索僅在MyISAM表引擎支持。

+0

但是文本是不是存儲在「外部」表中? 如果這是真的,則代替文本,將「指針」存儲到表中。 這可能意味着表格記錄很短,可能文本版本會更快? – Nick

+0

是的,它儲存在外面。但它有關係嗎?你沒有使用它。它不會更快。如果你使用'char_data',那麼它是有道理的。即使如此,性能差異將非常小。如果沒有嚴格的基準測試,你無法找到它。我懷疑你會達到這個極限 –

+0

我期待100M記錄,可能更多:) 但是從你告訴我的事情來看,varchar和text之間的唯一區別將是磁盤空間。 我甚至考慮壓縮字段以節省一些空間。 謝謝。 – Nick