之前不知道從哪邊學到錯的東西... 實驗後發現搞錯了。對 MySQL 的 VARCHAR 欄位下 index 所實際佔用的空間仍是實際大小,而非最大長度。
測試方法是建立表格,schema 是 CREATE TABLE test (id INT UNSIGNED PRIMARY AUTO_INCREMENT, data VARCHAR(255)) ENGINE=InnoDB;
,在 inndo_per_file
打開的情況下測試。
這是 1M rows,其中 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 rows,但 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 的確是依照內容的實際長度索引,而非用欄位的最大長度做。
index 的空間應分 2 種。1個是實體硬碟空間 另1個是 buffer pool 跟 order by group by 時的暫存 table 空間 ,而這兩個空間到底是固定長度還是可變長度在存?