溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql索引過(guò)長(zhǎng)以及專用密匙太長(zhǎng)的解決方法

發(fā)布時(shí)間:2021-11-08 12:48:19 來(lái)源:億速云 閱讀:353 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

今天就跟大家聊聊有關(guān)mysql索引過(guò)長(zhǎng)以及專用密匙太長(zhǎng)的解決方法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

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

下面是產(chǎn)生問(wè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;

我們可以看到,對(duì)于name,我們?cè)O(shè)置長(zhǎng)度為1000可變字符,因?yàn)椴捎胾tf8mb4編碼, 所以它的大小就變成了 1000 * 4 > 767
所以再不修改其他配置的前提下,varchar的長(zhǎng)度大小應(yīng)該是 767 / 4 = 191

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

解決辦法一

  • 使用innodb引擎

  • 啟用innodb_large_prefix選項(xiàng),修改約束擴(kuò)展至3072字節(jié)

  • 重新創(chuàng)建數(shù)據(jù)庫(kù)

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;

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

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

解決辦法二

在創(chuàng)建表的時(shí)候,加上 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;

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

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

看完上述內(nèi)容,你們對(duì)mysql索引過(guò)長(zhǎng)以及專用密匙太長(zhǎng)的解決方法有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI