MySQL中採用類型varchar(20)和varchar(255)對性能上的影響



1.MySQL建立索引時假設沒有限制索引的大小,索引長度會默認採用的該字段的長度。也就是說varchar(20)和varchar(255)相應的索引長度分別為20*3(utf-8)(+2+1),255*3(utf-8)(+2+1)。當中"+2"用來存儲長度信息,“+1”用來標記是否為空。載入索引信息時用varchar(255)類型會占用很多其它的內存; (備注:當字段定義為非空的時候。是否為空的標記將不占用字節)
比如。測試sql(InnoDB引擎)例如以下:
CREATE DATABASE TestDataBase
USE TestDataBase
CREATE TABLE ABC (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
ALTER  TABLE  `ABC`  ADD  INDEX `nameIndex` (`name`)
explain select name from ABC
alter table ABC  modify name varchar(255)
explain select name from ABC

結果中的ken_len表示索引使用的字節數:
key_len的長度計算公式:
varchr(10)變長字段且同意NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(變長字段) varchr(10)變長字段且不同意NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)+2(變長字段) char(10)固定字段且同意NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)+1(NULL) char(10)固定字段且同意NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)
依據這個值。就能夠推斷索引使用情況,特別是在組合索引的時候,推斷全部的索引字段都被查詢用到。


2.varchar(20)與varchar(255)都是保持可變的字符串,當使用ROW_FORMAT=FIXED創建MyISAM表時,會為每行使用固定的長度空間,這樣設置不同的varchar長度值時。存儲相同數據所占用的空間是不一樣。

通常情況下使用varchar(20)和varchar(255)保持'hello'占用的空間都是一樣的,但使用長度較短的列卻有巨大的優勢。較大的列使用很多其它的內存。由於MySQL一般會分配固定大小的內存塊來保存值,這對排序或使用基於內存的暫時表尤其不好。相同的事情也會發生在使用文件排序或者基於磁盤的暫時表的時候。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM