人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

mysql索引過長Specialed key was too long的解決方法

發(fā)布日期:2021-12-14 17:38 | 文章來源:gibhub

在創(chuàng)建要給表的時候遇到一個有意思的問題,提示Specified key was too long; max key length is 767 bytes,從描述上來看,是Key太長,超過了指定的 767字節(jié)限制

下面是產(chǎn)生問題的表結(jié)構(gòu)

CREATE TABLE `test_table` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(1000) NOT NULL DEFAULT '',
  `link` varchar(1000) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

我們可以看到,對于name,我們設(shè)置長度為1000可變字符,因為采用utf8mb4編碼, 所以它的大小就變成了 1000 * 4 > 767
所以再不修改其他配置的前提下,varchar的長度大小應該是 767 / 4 = 191

有興趣的同學可以測試下,分別指定name大小為191, 192時,是不是前面的可以創(chuàng)建表成功,后面的創(chuàng)建表失敗,并提示錯誤Specified key was too long; max key length is 767 bytes

解決辦法一

  • 使用innodb引擎
  • 啟用innodb_large_prefix選項,修改約束擴展至3072字節(jié)
  • 重新創(chuàng)建數(shù)據(jù)庫

my.cnf配置

set global innodb_large_prefix=on;
set global innodb_file_per_table=on;
set global innodb_file_format=BARRACUDA;
set global innodb_file_format_max=BARRACUDA;

上面這個3072字節(jié)的得出原因如下

我們知道InnoDB一個page的默認大小是16k。由于是Btree組織,要求葉子節(jié)點上一個page至少要包含兩條記錄(否則就退化鏈表了)。
所以一個記錄最多不能超過8k。又由于InnoDB的聚簇索引結(jié)構(gòu),一個二級索引要包含主鍵索引,因此每個單個索引不能超過4k (極端情況,pk和某個二級索引都達到這個限制)。
由于需要預留和輔助空間,扣掉后不能超過3500,取個“整數(shù)”就是(1024*3)。

解決辦法二

在創(chuàng)建表的時候,加上 row_format=DYNAMIC

CREATE TABLE `test_table` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `link` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format=DYNAMIC;

這個參數(shù)的作用如下

MySQL 索引只支持767個字節(jié),utf8mb4 每個字符占用4個字節(jié),所以索引最大長度只能為191個字符,即varchar(191),若想要使用更大的字段,mysql需要設(shè)置成支持數(shù)據(jù)壓縮,并且修改表屬性 row_format ={DYNAMIC|COMPRESSED}

到此這篇關(guān)于mysql索引過長Specialed key was too long的解決方法的文章就介紹到這了,更多相關(guān)mysql索引過長內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部