標籤(空格分隔): 高性能MYSQL 第四章 schema與數據類型 字符類型
VARCHAR和CHAR
值的存儲與具體的存儲引擎有關,下面以InnoDB爲例說明
1.1. VARCHAR
這長字符串,需要1或2個額外的字節記錄字符長度。VARCHAR(10) 11byte,VARCHAR(1000) 1002byte。update時可能使行變得更長,消耗較大。
適用: 1. 字符串值的最大長度比平均長度大得。 2. 列的更新少
1.2. CAHR
定長字符串。當值不足指定長度時,會以空格填充,所以不能識別末尾處的空格,相當於刪除末尾空格。
適用: 1. 值短 2. 所有的值長度接近 3. 經常變更
VARCHAR(5)、VARCHAR(200)哪個來存儲”HELLO”更有優勢?
VARCHAR(5)更好,因爲MYSQL會分配固定的大小的內存塊來保存內部值。尤其是使用(內存、磁盤)臨時表進行排序和操作時,會浪費大量內存。VBLOB和TEXT
字符類型:TINGTEXT SMALLTEXT TEXT MEDIUMTEXT LONGTEXT
SMALLTEXT TEXT是同義詞二進制類型:TINGBLOB SMALLBLOB BLOB MEDIUMBLOB LONGBLOB
BLOB SMALLBLOB是同義詞2.1. MYSQL把BLOB和TEXT值當作一個獨立的對象處理。
值太大時,InnoDB會使用專門的“外部”存儲區域進行存儲,此時每個值在行內需1~4個字節存儲一個指針
2.2. 只對每列的最前max_sort_length做排序,也可以使用order by substring(cloumn ,length)。
技巧:使用order by substring減少臨時表的空間
使用杖舉(ENUM)代替字符串
數據實際存儲爲整數,在表的.frm文件中存在“數字-字符串”的映射,且排序也是按內部整數排序。排序問題可以用order by field([field])解決