2009-07-01 39 views

回答

6

不要相信是否有人告訴你TINYTEXT是以其他方式存儲的,而不是VARCHAR。

實際的差別是:

  • TINYTEXT和其他文本字段從內存行分開存儲的MySQL堆裏面,而VARCHAR()場加起來64K的限制(所以你可以有一個以上在TINYTEXT中是64K,而你不會用VARCHAR)。如果TINYTEXT和其他類似blob的字段強制SQL層(MySQL)在使用磁盤臨時表時使用,而VARCHAR仍將在內存中排序(儘管將被轉換爲CHAR爲全寬)。

  • InnoDB內部並不關心它是tinytext還是varchar。驗證非常容易,創建兩個表格,一個使用VARCHAR(255),另一個使用TINYINT,並向兩者插入一條記錄。它們都將採用單個16k頁面,而如果使用溢出頁面,TINYTEXT表格應該顯示爲在「SHOW TABLE STATUS」中至少需要32k。

我通常喜歡VARCHAR(255) - 它們不會導致太多的堆碎片爲單列的,並且可以被視爲在MySQL中存儲一個64K的對象。 InnoDB的大小差異可以忽略不計。

1

我希望varchar比tinytext快,從我的谷歌搜索似乎是普遍的共識。當然你必須測試你的系統才能真正確定。

它更快的原因是因爲當MySQL執行某些操作(連接,排序等)時,它通常會創建臨時表。在臨時表中有BLOB類型(如tinytext)時,該表將基於磁盤而不是基於內存,這當然會對性能產生影響。

+0

我只是想,在內存中會有一個blob指針,只有訪問blob纔會導致一個磁盤命中,並且只能用於該表的一部分? – 2009-07-02 13:04:50

0

你可能也想看看使用char(255) - 雖然它確實佔用了更多的空間,但在以後進行比較時,使用大小恆定的字段的速度要快得多(根據我的經驗)。如果您只是在尋找速度,那麼額外的空間可以填充填充,然後稍後忽略空白。

但是,注意:MySQL不允許varcharchar類型存在於同一個表中。它也不[通常]允許在varcharchar之間進行比較。去年我在一個業餘愛好project的桌子實施中發現了這一點。

+0

at http://www.informit.com/articles/article.aspx?p=377652&seqNum=3,我讀到了innodb表格,最好使用varchar:「內部行存儲格式不處理固定長度和可變長度列不同(所有行使用包含指向列值的報頭),所以使用固定長度CHAR列本身不是本質上比使用可變長度VARCHAR列」 – 2009-07-03 10:15:02

+0

有趣簡單 - 不爭議的製品,只是那一直是我的經驗..雖然我可能一直在使用MyISAM – warren 2009-07-03 23:52:25

1

CHAR/VARCHAR會更快,因爲這些列與主行數據*存儲在同一頁面中,而TEXT類型存儲在頁面 (我錯了,請參閱Harrison的評論)。

人們過去使用tinytext很多,因爲varchar(令人討厭地)修剪尾隨空白。這個行爲在MySQL 5.0中被刪除了。

(*至少第一個768字節,內置InnoDB,而不是新的InnoDB插件)。

相關問題