2010-01-07 30 views
3

在MySQL中,有沒有人/有任何比較,個人經驗或指導何時使用text類型而不是大的varchar什麼是在MySQL中使用文本而不是varchar類型的實際性能影響?

儘管我的數據庫中的大多數條目少於1000個字符,但有些條目最多可能需要4000個字符或更多。 varchar的限制長度是多少,這使得text成爲一個更好的變體?

我不需要索引這些字段。

+0

你不會在WHERE子句或SELECT子串中使用該列,對吧? – Thilo 2010-01-07 00:48:37

+0

@Thilo:對,我不會在WHERE中使用它。 – Viliam 2010-01-07 00:49:49

+1

只要您不在結果集中包含該列作爲輸出列,文本就沒有問題。即只有在返回單行的查詢中返回文本列。注意:這在任何情況下都應該是自然而然的事情,因爲這樣的「大型」列在向用戶呈現特定行時才真正有用。但是,有些開發人員犯了過分使用'SELECT * FROM ...'的錯誤。 – 2010-01-07 08:12:03

回答

5

我沒有親身經歷,但這個傢伙確實:

VARCHAR vs. TEXT - some performance numbers

快速回答:VARCHAR是一個很好的快一點。

編輯 - 不,它不是。他用不同的索引 - 他在varchar(255個字符)上有一個完整的索引,但在文本上有一個255個字符的前綴索引。當他刪除時,他們表現差不多。

在線程後來是這個有趣的花絮:

當需要TMP表的 選擇,第一選擇是使用 內存,這將是隻在RAM上,因此 可能顯着更快。 (第二個 的選擇是MyISAM。)但是,TEXT和 BLOB在MEMORY中是不允許的,所以它 不能使用它。 (還有其他原因 爲什麼它可能會跳過存儲器)

編輯2 - 一些更相關的信息,這次比較的方式不同的索引處理多種類型。

MyISAM將TEXT和BLOB放入「inline」中。如果 您正在搜索一個表(範圍掃描 /表掃描),那麼您正在'跳過 這些牛田稻田' - 對於磁盤 I/O成本很高。也就是說, 內聯blob的存在會損害此 情況下的性能。

InnoDB只放入767字節的文本 或BLOB內聯,其餘的進入 其他塊。這是一個妥協 有時幫助,有時會損害 的表現。

別的東西(Maria?Falcon?InnoDB 插件?)將TEXT和BLOB完全放在其他地方 。與VARCHAR相比,這會使 在性能 上產生顯着差異。有時 文本會更快(例如,範圍掃描 ,不需要blob); 有時VARCHAR會更快 (例如,如果您需要查看它和/或 返回它)。

+0

那麼,但在那篇文章中,TEXT/VARCHAR列被用作主鍵。 OP表示他不會索引該專欄。 – Thilo 2010-01-07 00:51:28

+0

Thilo - 你是對的,我只是想解決「text vs varchar性能問題」這個更普遍的問題。其他人閱讀可能會發現它有用。 – danben 2010-01-07 00:53:05

+0

是的,但我認爲測量受到索引的影響。我不會將文本列作爲主鍵。 – Viliam 2010-01-07 00:53:37

1

當然,最好的方法是使用真實數據集或至少模擬等價物自己運行一些測試。只需編寫一些腳本來填充數據並運行您的選擇。使用不同大小的varchar進行測試,然後測試文本,並測量時序和整體系統利用率(CPU /負載,內存,磁盤I/O)。

如果你將有足夠的負荷,這會事,那麼你應該有自動化測試反正。

+1

我認爲這對於許多數據庫架構師來說很有意義,因爲它並不一定要用一種具體的佈局和架構來加強。這種「自己發現」的答案對我和其他人都是有用的。 :) – Viliam 2010-01-07 14:25:41

相關問題