mysql5.6建立索引報(bào)錯(cuò)1709問(wèn)題及解決
現(xiàn)象描述
在給varchar字段建立索引時(shí),報(bào)錯(cuò)如下:
[root@localhost:(test) 13:53:27]> CREATE INDEX b_name_IDX USING BTREE ON test.b(name);ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
查看表結(jié)構(gòu):
CREATE TABLE `b` ( `name` varchar(250) DEFAULT NULL, `standardized_name` varchar(250) DEFAULT NULL, `is_reagent` int(11) NOT NULL DEFAULT '0', `is_solvent` int(11) NOT NULL DEFAULT '0', `is_catalyst` int(11) NOT NULL DEFAULT '0', `is_ligand` int(11) NOT NULL DEFAULT '0', `to_delete` int(11) DEFAULT '0', ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
原因分析
索引字段的長(zhǎng)度大于767,或者說(shuō),使用到的字段的長(zhǎng)度和大于767則報(bào)錯(cuò)。
MySQL 5.6 中的innodb_large_prefix
默認(rèn)是關(guān)閉的。
在MySQL中,innodb_large_prefix
參數(shù)是一個(gè) InnoDB 存儲(chǔ)引擎的配置選項(xiàng)。
這個(gè)參數(shù)控制是否允許使用超過(guò)767字節(jié)(或255個(gè)字符)的索引前綴。
默認(rèn)情況下,在MySQL 5.6及以前版本中,InnoDB存儲(chǔ)引擎對(duì)索引列的最大長(zhǎng)度限制為767字節(jié)。
對(duì)于變長(zhǎng)數(shù)據(jù)類(lèi)型如VARCHAR,這個(gè)限制包括了字符集的每個(gè)字符可能占用的字節(jié)數(shù),而不是僅僅指字符數(shù)。
例如,如果你使用的是UTF-8字符集,每個(gè)字符可能占用1到4個(gè)字節(jié),所以一個(gè)VARCHAR(255)字段的實(shí)際最大長(zhǎng)度可能會(huì)遠(yuǎn)小于255個(gè)字符。
當(dāng) innodb_large_prefix
設(shè)置為 ON
時(shí),InnoDB 支持更大的索引前綴長(zhǎng)度,最大可以達(dá)到3072字節(jié)。
這意味著你可以創(chuàng)建更長(zhǎng)的索引,特別是對(duì)于包含大量變長(zhǎng)數(shù)據(jù)類(lèi)型的列。
這對(duì)于處理大數(shù)據(jù)表和需要更復(fù)雜查詢的情況非常有用。
要啟用 innodb_large_prefix
,你可以在 MySQL 配置文件(如 my.cnf 或 my.ini)中添加以下行,并重啟 MySQL 服務(wù)以應(yīng)用更改:
[mysqld] innodb_large_prefix = ON
或者,你可以在運(yùn)行時(shí)通過(guò)設(shè)置全局變量來(lái)開(kāi)啟它:
SET GLOBAL innodb_large_prefix = ON;
請(qǐng)注意,為了使 innodb_large_prefix
生效,還需要同時(shí)滿足以下條件:
- 數(shù)據(jù)庫(kù)文件格式必須是 Barracuda。
- 表格式必須是 DYNAMIC 或 COMPRESSED。
- 對(duì)于 ROW_FORMAT=COMPACT 的表,仍然有 767 字節(jié)的索引前綴限制。
有關(guān)這些條件的詳細(xì)信息,請(qǐng)參閱 MySQL 文檔。
問(wèn)題處理
set global innodb_large_prefix=on; show variables like 'innodb_large_prefix'; alter table b Row_format=dynamic; set global innodb_file_format=BARRACUDA;
再次加索引:
[root@localhost:(test) 13:54:18]> CREATE INDEX b_name_IDX USING BTREE ON test.b(name); Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一次非法關(guān)機(jī)導(dǎo)致mysql數(shù)據(jù)表?yè)p壞的實(shí)例解決
本文介紹由于非法硬件關(guān)機(jī),造成了mysql的數(shù)據(jù)表?yè)p壞,數(shù)據(jù)庫(kù)不能正常運(yùn)行的一個(gè)實(shí)例,接下來(lái)是作者排查錯(cuò)誤的過(guò)程,希望對(duì)大家能有所幫助2013-01-01node 多種方法連接mysql數(shù)據(jù)庫(kù)(最新推薦)
mysql是一個(gè)流行的第三方模塊,可以通過(guò)npm安裝,在Node.js 中,有多種方法可以連接 MySQL 數(shù)據(jù)庫(kù),本文通過(guò)實(shí)例代碼講解node 多種方法連接mysql數(shù)據(jù)庫(kù)的示例代碼,感興趣的朋友跟隨小編一起看看吧2023-07-07mysql 8.0.18各版本安裝及安裝中出現(xiàn)的問(wèn)題(精華總結(jié))
這篇文章主要介紹了mysql 8.0.18各版本安裝及安裝中出現(xiàn)的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12percona-toolkit之pt-kill 殺掉mysql查詢或連接的方法
本文主要描述了percona-toolkit中pt-kill的 使用實(shí)例 ,及 一些重要參數(shù)的介紹,需要的朋友可以參考下2016-04-04mysql使用物理備份安裝xtrabackup的詳細(xì)過(guò)程
這篇文章主要介紹了mysql使用物理備份安裝xtrabackup的詳細(xì)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05MySQL數(shù)據(jù)庫(kù)的索引原理與慢SQL優(yōu)化的5大原則
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)的索引原理與慢SQL優(yōu)化的5大原則,包括:建立索引的原則,慢查詢優(yōu)化基本步驟,慢查詢優(yōu)化案例,explain使用,需要的朋友可以參考下2023-02-02mysql優(yōu)化小技巧之去除重復(fù)項(xiàng)實(shí)現(xiàn)方法分析【百萬(wàn)級(jí)數(shù)據(jù)】
這篇文章主要介紹了mysql優(yōu)化小技巧之去除重復(fù)項(xiàng)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了mysql去除重復(fù)項(xiàng)的方法,并附帶了隨機(jī)查詢優(yōu)化的相關(guān)操作技巧,需要的朋友可以參考下2020-01-01MySQL Threads_running飆升與慢查詢的相關(guān)問(wèn)題解決
這篇文章主要介紹了MySQL Threads_running飆升與慢查詢的問(wèn)題解決,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2021-05-05