2

关于MySQL参数innodb_large_prefix设置的问题

 3 years ago
source link: http://www.veiking.cn/blog/1068-page.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

关于MySQL参数innodb_large_prefix设置的问题

程序员甲   @Veiking   2021-04-05

在低版本的MySQL使用过程中,当我们在使用某个较长字段创建唯一索引时,经常会爆出1709的错误:innodb_large_prefix and ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes. 这是设置索引长度超了。报这个错误在5.6之前的MySQL使用中非常普遍,但不同版本处理的方法多少还是有些不同,需要注意

低版本MySQL使用过程中,当我们在使用某个较长字段,去尝试创建唯一索引时,经常会爆出1709的错误:

innodb_large_prefix and ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

从字面的意思可以知道,是索引长度超了,超出了767这个长度的限制,一般默认情况下,在varchar字段上做索引操作,怎么说都会超的。

报这个错误在5.6之前的MySQL使用中非常普遍,但各个版本处理的方法多少还是有些不同。

在5.6中,普遍的应对方法就是设置两项参数:

set global innodb_file_format = BARRACUDA;
set global innodb_large_prefix = ON;

或者在数据库配置文件 my.ini(my.cnf) 中作如下配置:

innodb-file-format=barracuda
innodb-large-prefix=ON

没什么意外的话重启服务器就OK了,但如果还是不行,这就得留意下innodb-file-per-table参数是否有问题,同时操作如下:

set global innodb_file_per_table = ON;
innodb_file_per_table=ON

这样基本就没什么问题了。


但是在更早的5.5版本中,innodb-large-prefix=ON之类的配置可能是无效的,纠察半天发现,原来5.5的有些版本,配置文件这个参数上设置“ON”是不认的,只能用10来处理,

知道这里就好说了,我们就换成如下设置:

innodb_file_format=Barracuda
innodb_file_per_table=1
innodb_large_prefix=1

然后重启服务器进行尝试。

如果做完以上操作,还没有完,继续报错,那很有可能我们用了utf8mb4字符集,或者索引字段确实太长了,那就只能研究这个Barracuda的东西;

我们设置的Barracuda文件格式支持4种row_format:RedundantCompactCompressedDynamic,其中Dynamic格式下,溢出的列只存储前20字节,一旦发生了行溢出,dynamic其实就存储一个指针,数据都放在溢出页里。

既然是在创建索引,我们也不能让索引数据在长度问题上吭哧吭哧死磕,这个Dynamic就给出了比较好的方案,于是,我们需要对操作表的row_format做如下设置:

alter table XXX row_format=dynamic;

或者在创建新表之初,即添加初始设置:、

create table XXX(id ...) row_format=dynamic;

这样,问题就解决了。


注意在使用过程中,有些参数设置完成之后可能没起作用,可以执行以下指令,用于确认:

SHOW ENGINES;    -- 查看引擎类型信息

SHOW VARIABLES LIKE '%innodb_file_format%';    -- 查看innodb_file_format参数信息
SHOW VARIABLES LIKE '%innodb_file_per_table%';    -- 查看innodb_file_per_table参数信息
SHOW VARIABLES LIKE '%innodb_large_prefix%';    -- 查看innodb_large_prefix参数信息

SHOW TABLE STATUS LIKE '%table_XXX%';     -- 查看表row_format参数信息

以上这些,是处理关于MySQL参数innodb_large_prefix设置的问题时总结的笔记,希望对大家有所帮助。


Recommend

  • 62
    • www.tuicool.com 6 years ago
    • Cache

    On InnoDB Data Compression in MySQL

    Another story that I've prepared back in April for my meeting with one of customers in London was a "compression story". We spent a lot of time on it in several support issues in the past, with only limited success....

  • 56
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    MySQL InnoDB引擎锁的总结

  • 77

    Welcome to the third part of this series. I’m glad you’re still reading, as hopefully this means you find this subject interesting at least. Pr...

  • 83
    • blog.51cto.com 6 years ago
    • Cache

    MySQL InnoDB redo Log 浅析-王伟

    MySQL的InnoDB存储引引擎的物理文件存储体系中,除了实际的数据文件(ibd,ibdata)之外,还有两个非常重要的日志系统,分别是redo日志和undo日志。跟Oracle类似,redolog记录了对实际数据文件的物理变更(数据文件的什么位置数据做了如何的变更)。InnoDB也是采用了WAL...

  • 74
    • segmentfault.com 6 years ago
    • Cache

    mysql innodb索引原理

    聚集索引(clustered index) innodb存储引擎表是索引组织表,表中数据按照主键顺序存放。其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这些叶子节点成为数据页。 聚...

  • 54
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    MySQL探秘(八):InnoDB的事务

  • 29

    数据丢失的定义:当事务提交了,数据因为特殊原因不存在了。MySQL默认情况下是开启内部的XA事务和事务的实现方式是基于redolog和undolog。也可以理解为MySQL事务是采用日志现行的策略。前提未开启binlog的情况下,数据的变更首先在内存中完成,并且将事务顺序的写...

  • 8

    前面章节之所以介绍那么多锁的知识点和示例,其实最终目的就是为了排查与解决死锁的问题,下面我们把之前学过锁知识重温与补充一遍,然后再通过例子演示下如果排查与解决死锁。 2.前期准备 ●数据库事务隔离级别

  • 6
    • hellolyfing.github.io 2 years ago
    • Cache

    外部服务的连接参数合理设置问题

    外部服务的连接参数合理设置问题 May 15, 2020 一、背景描述 现在的公司使用的阿里云的机器及服务,由于阿里云的Redis不可用导致我们整站的服务出现不可用。本文讨论的重点不是这个,而是,当阿里云...

  • 5

    V2EX  ›  信息安全 DKIM 是怎么工作的,为什么设置 prefix 收件服务器还能找到 DKIM 记录?  

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK