关于MySQL极限值的初步验证纠错

晚上从珠江边回来之后,看到一篇文章说,MySQL有几个极限值,一个表的字段最多只有1017个,我看了以后表示怀疑。怎么快速验证呢,我看到文章的时候已经11点了,只有不到1个小时的时间来验证了。我想不能通过手工的方式来做,写个简单的脚本,能实现功能即可。 于是三下五除二,我写了下面的简单shelll脚本,跑一个循环,批量生成表结构信息。 首先我尝试的是int数据类型,脚本如下:

new=$1
echo 'drop table if exists test_new;' > aaa.sql
echo 'create table test_new(' >> aaa.sql
echo 'col1 int' >> aaa.sql
for ((i=2;i<=new;i++)) 
do 
echo ,col_$i int
done  >> aaa.sql
echo ');' >> aaa.sql

mysql  test  <aaa.sql
mysql  test  -e "show tables"

调用的时候只需要输入最大值即可。 比如,sh test.sh 1017发现确实如此,如果有107个int型字段是没有问题的,1018会抛出下面的错误。

# sh test.sh 1018
ERROR 1117 (HY000) at line 2: Too many columns
+----------------+
| Tables_in_test |
+----------------+
| test           |
| test_data      |
+----------------+

可见正如这位网友所说1017个字段,对于int型确实如此。 再进一步,我可以测试varchar类型,比如指定为varchar(20) 脚本略作修改

new=$1
echo 'drop table if exists test_new;' > aaa.sql
echo 'create table test_new(' >> aaa.sql
echo 'col1 varchar(20)' >> aaa.sql
for ((i=2;i<=new;i++)) 
do 
echo ,col_$i varchar\(20\) 
done  >> aaa.sql
echo ');' >> aaa.sql

mysql  test  <aaa.sql
mysql  test  -e "show tables"

结果发现,1017个字段显然不行,怎么测试边界呢,我们可以使用二分法来快速迭代,比如1017不可以,我可以尝试500,如果500可以就尝试750,否则尝试250,以此类推。 很快得到了边界值,如果都是varchar(20),边界值是383

[root@oel642 ~]# sh aa.sql 384
ERROR 1118 (42000) at line 2: Row size too large (> 8126). Changing  some columns to TEXT or BLOB may help. In current row format, BLOB  prefix of 0 bytes is stored inline.
+----------------+
| Tables_in_test |
+----------------+
| test           |
| test_data      |
+----------------+

显然可以充分印证上面的结论还是不够严谨的,而至于细节的原因我们可以继续深入,后续继续分析下。 同理我们可以2分钟内模拟下表名的最大长度,我们知道MySQL里指定的最大长度是64,我们可以使用lpad来实现。 生成64位的表名。

mysql>  select lpad('a',64,'a');
+------------------------------------------------------------------+
| lpad('a',64,'a')                                                 |
+------------------------------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create table  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (id int);
Query OK, 0 rows affected (0.09 sec)

都不用迭代,只需要补充一个a就可以了。

mysql> create table  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (id int);
ERROR 1059 (42000): Identifier name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' is too long

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

你不得不知道的 MySQL 优化原理(一)

说起MySQL的查询优化,相信大家收藏了一堆奇淫技巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型….. 你是否真的理解...

1612
来自专栏大数据和云计算技术

数据库中的元数据

刘耀铭同学元数据系列作品的第三篇,大家支持! 今天跟大家谈谈数据库中的元数据 数据库中的元数据无非就是对数据库中数据的描述与定义。 ? 我们先举个现实生活中...

3016
来自专栏PHP在线

WordPress的可拓展性初探(一)

作者:西瓜玩偶(racnil070512 at hotmail dot com) WordPress是一个时下非常流行的网络信息发布平台,它的特性之一便是极强...

2999
来自专栏吴伟祥

mysql 自增id和UUID做主键性能分析,及最优方案

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领...

4032
来自专栏IT米粉

数据库的使用你可能忽略了这些

很明显,不同的类型存储的长度有很大区别的,对查询的效率有影响,字段长度对索引的影响是很大的。

44810
来自专栏北京马哥教育

Python操作SQLite/MySQL/LMDB/LevelDB

1. 概述 1.1 前言 最近用Caffe跑自己的数据集,需要学习LMDB和LevelDB,趁此机会复习了SQLite和MySQL的使用,一起整理在此。 代码...

5288
来自专栏性能与架构

数据库表设计对性能的影响

很多人看来,数据库Schema设计是一件非常简单的事情,大体按照系统设计时候的相关实体对象对应成一个一个表格就可以了。为了在功能上尽可能容易扩展,根据数据库范式...

3945
来自专栏跨界架构师

C#和NewSQL更配 —— CockroachDB入门(可能是C#下的全网首发)

  CockroachDB(https://www.cockroachlabs.com)是Google备受瞩目的Spanner的开源模仿,承诺提供一种高存活性、...

1115
来自专栏数据库

单机数据库优化

数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表。...

2177
来自专栏乐百川的学习频道

Python 爬虫获取某贴吧所有成员用户名

最近想用Python爬虫搞搞百度贴吧的操作,所以我得把原来申请的小号找出来用。有一个小号我忘了具体ID,只记得其中几个字母以及某个加入的贴吧。所以今天就用爬虫来...

20910

扫码关注云+社区

领取腾讯云代金券