本文主要給大家介紹MySQL索引過長怎么辦,希望可以給大家補充和更新些知識,如有其它問題需要了解的可以持續(xù)在創(chuàng)新互聯(lián)行業(yè)資訊里面關(guān)注我的更新文章的。
成都創(chuàng)新互聯(lián)公司主營汕城網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),汕城h5微信小程序搭建,汕城網(wǎng)站營銷推廣歡迎汕城等地區(qū)企業(yè)咨詢
mysql 索引過長1071-max key length is 767 byte
問題
create table: Specified key was too long; max key length is 767 bytes
原因
數(shù)據(jù)庫表采用utf8編碼,其中varchar(255)的column進行了唯一鍵索引
而mysql默認情況下單個列的索引不能超過767位(不同版本可能存在差異)
于是utf8字符編碼下,255*3 byte 超過限制
解決
1 使用innodb引擎;
2 啟用innodb_large_prefix選項,將約束項擴展至3072byte;
3 重新創(chuàng)建數(shù)據(jù)庫;
my.cnf配置:
default-storage-engine=INNODB
innodb_large_prefix=on
一般情況下不建議使用這么長的索引,對性能有一定影響;
這是網(wǎng)上的一遍文章的解決辦法,但是我沒有修改成功
下面我參考了一些其他的文章并結(jié)合自己的操作一步步去確定問題在哪。
有同學(xué)問到InnoDB的索引長度問題,簡單說幾個tips。
關(guān)于3072
大家經(jīng)常碰到InnoDB單列索引長度不能超過767bytes,實際上聯(lián)合索引還有一個限制是3072。
Sql代碼 收藏代碼
mysql> CREATE TABLE tb
(
-> a
varchar(255) DEFAULT NULL,
-> b
varchar(255) DEFAULT NULL,
-> c
varchar(255) DEFAULT NULL,
-> d
varchar(255) DEFAULT NULL,
-> e
varchar(255) DEFAULT NULL,
-> KEY a
(a
,b
,c
,d
,e
)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes
可以看到,由于每個字段占用255*3, 因此這個索引的大小是3825>3072,報錯。
為什么3072
我們知道InnoDB一個page的默認大小是16k。由于是Btree組織,要求葉子節(jié)點上一個page至少要包含兩條記錄(否則就退化鏈表了)。
所以一個記錄最多不能超過8k。
又由于InnoDB的聚簇索引結(jié)構(gòu),一個二級索引要包含主鍵索引,因此每個單個索引不能超過4k (極端情況,pk和某個二級索引都達到這個限制)。
由于需要預(yù)留和輔助空間,扣掉后不能超過3500,取個“整數(shù)”就是(1024*3)。
單列索引限制
上面有提到單列索引限制767,起因是256×3-1。這個3是字符最大占用空間(utf8)。但是在5.5以后,開始支持4個字節(jié)的uutf8。255×4>767, 于是增加了一個參數(shù)叫做 innodb_large_prefix。
這個參數(shù)默認值是OFF。當改為ON時,允許列索引最大達到3072。
** 我又參考了上邊這篇文章確定了這個最大3072是可以的,那下面我們找方法把它弄成3072.**
MySQL 環(huán)境配置:
Server version: 5.6.28-log MySQL Community Server (GPL)
Server characterset: utf8mb4
Db characterset: utf8mb4
解決辦法:
(1)查看相關(guān)配置并作出如下設(shè)置
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_per_table = ON
(2)修改建表語句,加入 row_format=DYNAMIC
create table piratebay(
SYS_ID int ,
FILE_NAME VARCHAR(200),
FILE_ID VARCHAR(30),
NUM1 VARCHAR(30),
NUM2 VARCHAR(30),
MAGNET_LINK VARCHAR(500),
PRIMARY KEY (sys_id),
KEY piratebay_n1 (FILE_NAME))
engine=innodb row_format=dynamic;
原因:
MySQL 索引只支持767個字節(jié),utf8mb4 每個字符占用4個字節(jié),所以索引最大長度只能為191個字符,即varchar(191),若想要使用更大的字段,mysql需要設(shè)置成支持數(shù)據(jù)壓縮,并且修改表屬性 row_format ={DYNAMIC|COMPRESSED}
大家看明白了吧,吧row_formatl類型修改為這兩種模式。
下面是我做的過程圖:
可以看到row_formatl類型,下面修改類型
CREATE TABLE test2
( id
int(11) NOT NULL AUTO_INCREMENT, date
varchar(25) DEFAULT NULL, sess_id
varchar(255) DEFAULT NULL, keyword
varchar(25) NOT NULL, url_n
varchar(3) DEFAULT NULL, s_n
varchar(3) DEFAULT NULL, select_url
varchar(255) DEFAULT NULL, UNIQUE KEY (id
,keyword
) ) ENGINE=innodb DEFAULT row_format=dynamic;
看了以上關(guān)于Mysql索引過長怎么辦,希望能給大家在實際運用中帶來一定的幫助。本文由于篇幅有限,難免會有不足和需要補充的地方,如有需要更加專業(yè)的解答,可在官網(wǎng)聯(lián)系我們的24小時售前售后,隨時幫您解答問題的。
分享題目:Mysql索引過長怎么辦
分享地址:http://bm7419.com/article24/pssice.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、網(wǎng)站設(shè)計公司、品牌網(wǎng)站建設(shè)、ChatGPT、搜索引擎優(yōu)化、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)