MySQL 對 VARCHAR 的 Index 空間佔用的問題…

轉貼一下別人的測試,

之前有一個老師跟我說MySQL設定好長度以後,

每個資料都會依照最大長度去儲存,

害我每次設計都要想很久,

以下是原文,轉貼自此

之前不知道從哪邊學到錯的東西… 後來實驗後發現搞錯了。MySQL 對 VARCHAR 欄位下 index 所實際佔用的空間仍是實際大小,而非最大長度。

測試方法是建立表格,database schema 是 CREATE TABLE test (id INT UNSIGNED PRIMARY AUTO_INCREMENT, data VARCHAR(255));

這是 1M row,其中 data 都是 “a”,這是 OPTIMIZE TABLE 後的結果:(以下每個都有 OPTIMIZE TABLE)

-rw-rw---- 1 mysql mysql     8586 Jul 30 22:42 test.frm
-rw-rw---- 1 mysql mysql 37748736 Jul 30 22:42 test.ibd

這是 ADD INDEX (data) 後的結果:

-rw-rw---- 1 mysql mysql     8586 Jul 30 22:46 test.frm
-rw-rw---- 1 mysql mysql 50331648 Jul 30 22:46 test.ibd

這是 1M row,data 都是 “a” * 100 (一百個 a) 的結果:

-rw-rw—- 1 mysql mysql 8586 Jul 30 23:14 test.frm
-rw-rw—- 1 mysql mysql 146800640 Jul 30 23:15 test.ibd

這是 ADD INDEX (data) 後的結果:

-rw-rw---- 1 mysql mysql      8586 Jul 30 23:21 test.frm
-rw-rw---- 1 mysql mysql 260046848 Jul 30 23:23 test.ibd

實驗可以看出來 MySQL 的確是依照內容的實際長度索引,而非用欄位的最大長度做。