MySQL索引到底支援多少位元組?

狗福發表於2017-08-06
那麼我們來看一下MySQL varchar型別的索引到底能盛多少位元組的東西。
MySQL的varchar索引只支援不超過768個位元組 
atin1 = 1 byte = 1 character
uft8 = 3 byte = 1 character
gbk = 2 byte = 1 character
如果是GBK,也就是雙位元組,那麼這個索引能盛768/2=384位元組。

如果建立一個大欄位的索引的時候就需要注意這些,否則就會報錯,如下:
mysql> create index sql_q on slow_log(sql_md5,sql_info);
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql>

這種情況就可以使用字首索引來解決這個問題:

alter table XXX add index ind_contentl(content(100)) //100 或其它的數

 MySQL 5.5 之前, UTF8 編碼只支援1-3個位元組 
從MYSQL5.5開始,可支援4個位元組UTF編碼utf8mb4,一個字元最多能有4位元組,utf8mb4相容utf8,所以能支援更多的字符集。 
單列索引限制767,起因是256×3-1。這個3是字元最大佔用空間(utf8)。
5.5以後,開始支援4個位元組的utf8。255×4>767, 於是增加了一個引數叫做 innodb_large_prefix。
這個引數預設值是OFF。當改為ON時,允許列索引最大達到3072。
但是開啟該引數後還需要開啟表的動態儲存或壓縮:
Enable this option to allow index key prefixes longer than 767 bytes (up to 3072 bytes) for InnoDB tables that use DYNAMIC or COMPRESSED row format. (Creating such tables also requires the option values innodb_file_format=barracuda and innodb_file_per_table=true.) See Section 14.8.1.7, “Limits on InnoDB Tables” for maximums associated with index key prefixes under various settings.


相關文章