tika设置文件长度限制_MySQLInnoDB某些你没注意过的限制

本文详细介绍了MySQL InnoDB存储引擎中关于表的最大大小、列的最大数量、行大小限制以及索引限制等关键限制。讨论了如何这些限制受存储引擎、页面大小和数据类型的影响,并给出了具体的数值示例。
摘要由CSDN通过智能技术生成

01

目录

0a5c4813178aa0d5f6db5b82a980a75b.png

02

前言

最近一个朋友遇到一个面试题:MySQL的InnoDB的一个表最多能存多少数据?这么一问,我瞬间也蒙圈了,这是我的知识盲区啊,之前还从来没考虑过这样的问题。那我怎么能甘心的,只好去网上一顿查资料,下面我就分享一下我查到的结果。版本Mysql8.0。

03

表的最大大小

表的最大大小也是表空间的最大大小。最小表空间大小略大于10MB。最大表空间大小取决于 InnoDB页面大小。
InnoDB页面大小最大表空间大小
4KB16TB
8KB32TB
16KB64TB
32KB128TB
64KB256TB
在某些较旧的操作系统上,文件必须小于2GB。这不是 InnoDB限制。如果需要大型系统表空间,请使用几个较小的数据文件(而不是一个大型数据文件)进行配置,或者在每个表文件和常规表空间数据文件之间分配表数据。 看完这个发现,居然不是一个固定的答案。。。它会跟 InnoDB设置的页面大小有关。。。(内心呐喊!) 了解了这一个,我们接着来看看还有哪些我们都没考虑过的“奇奇怪怪”的限制~

04

列的最大数量

这是一个坑点!为什么这么说?因为InnoDB的限制和MySQL的限制不一样!!!
  • InnoDB一个表最多可以包含1017列。虚拟生成的列包含在此限制中。

  • MySQL对每个表有4096列的硬限制,但是对于给定的表,有效最大值可能会更少。确切的列限制取决于几个因素:

    看着头都大了。。。

    • 一个表的最大行大小限制了列的数量(可能还有大小),因为所有列的总长度不能超过该大小。

    • 单个列的存储要求限制了给定最大行大小内的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素。

    • 存储引擎可能会施加其他限制表列计数的限制。例如, InnoDB每个表的限制为1017列。

    • 功能键部分被实现为隐藏的虚拟生成的存储列,因此表索引中的每个功能键部分都计入表的总列数限制。

05

行大小限制

给定表的最大行大小由几个因素决定:

  • MySQL表的内部表示具有65,535字节的最大行大小限制,即使存储引擎能够支持更大的行也是如此。BLOBTEXT列仅有助于朝向行大小限制9〜12字节,因为它们的内容是从该行的其余部分分开存储。

  • InnoDB 对于4KB,8KB,16KB和32KB innodb_page_size设置,表 的最大行大小(适用于本地存储在数据库页面内的数据)略小于页面的一半 。例如,对于默认的16KB InnoDB页面大小,最大行大小略小于8KB 。对于64KB页面,最大行大小略小于16KB。LONGBLOBLONGTEXT列必须小于4GB,并且总行大小(包括BLOB和 TEXT列)必须小于4GB。

  • 不同的存储格式使用不同数量的页面标题和尾部数据,这会影响行可用的存储量。

行大小限制示例:

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),       f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the usedtable type, not counting BLOBs, is 65535. This includes storage overhead,check the manual. You have to change some columns to TEXT or BLOBs
InnoDB 表的操作成功,因为更改列 TEXT可以避免MySQL 65,535字节的行大小限制,而InnoDB 变长列的页外存储可以避免 InnoDB行大小限制。
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),       f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec)

06

索引限制

  • InnoDB一个表最多可以包含64个二级索引。

  • 对于InnoDB使用表DYNAMIC(MySQL8.0默认行格式)或 COMPRESSED行格式的表, 索引键前缀长度限制为3072字节 。

  • 对于使用REDUNDANTCOMPACT行格式的InnoDB表,索引键前缀长度限制为767个字节。例如,假设utf8mb4字符集且每个字符最多4个字节,则您可能在TEXTVARCHAR列上使用超过191个字符的列前缀索引来达到此限制。

  • 尝试使用超出限制的索引键前缀长度将返回错误。

  • 如果在创建MySQL实例时通过指定选项将InnoDB 页面大小减小到8KB或4KB innodb_page_size,则基于16KB页面大小的3072个字节的限制,按比例减小索引键的最大长度。即,当页面大小为8KB时,最大索引键长度为1536字节,而当页面大小为4KB时,最大索引键长度为768字节。

  • 适用于索引键前缀的限制也适用于全列索引键。

  • 多列索引最多允许16列。超过限制将返回错误。

ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed

07

结语

这些限制平时真的是没接触过,不过居然有人面试会问这个东西,想想都很可怕。

内容都来自 MySQL官网~感兴趣的可以去点击“查看原文”去官网看。不得不说,官网的资料是真全啊,就是看完之后发现自己对MySQL其实是一无所知。。。

如有错误,欢迎指出。

   欢迎大家关注我的个人技术分享公众号,可以推荐身边的朋友关注哦~

78ee95a304e162d0464c7f2f3fea5f21.png

点此留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值