首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不触及AUTO_INCREMENT的情况下获得INFORMATION_SCHEMA

在不触及AUTO_INCREMENT的情况下获得INFORMATION_SCHEMA
EN

Stack Overflow用户
提问于 2013-11-12 21:00:53
回答 1查看 819关注 0票数 1

我被分配创建一个bash脚本,用于检查AUTO_INCREMENT列何时接近其极限。我认为最好的方法是获得“当前自动增量值”,并将其与“最大值支持的列的数据类型”进行比较(比如tinyint为255个)。

我们的数据库中有大约2Tb的数据,我不想查询INFORMATION SCHEMA表来获取AUTO_INCREMENT,因为这需要太长时间。

因此,我不能使用(SHOW TABLE STATUS LIKE 'table_name')(SELECT AUTO_INCREMENT FROM information_schema.tables),因为这两个查询INFORMATION SCHEMA表。

有人告诉我,在不触及信息模式表的情况下,获得当前的AUTO_INCREMENT可能有一个解决办法,但我看不出是如何实现的。有什么想法吗?

我就是这样得到数据类型的。

代码语言:javascript
复制
DATA_TYPE="`$MYSQLCONNECT -D $DATABASE --batch -N -e "SELECT DATA_TYPE FROM         
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '$DATABASE' AND TABLE_NAME='$TABLE' AND 
EXTRA='auto_increment'"`"

这就是我如何获得该列可以处理的最大值:

代码语言:javascript
复制
MAX_VALUE="`$MYSQLCONNECT -D $DATABASE --batch -N -e "SELECT ( CASE '$DATA_TYPE' WHEN 'tinyint' 
THEN 255 WHEN 'smallint' THEN 65535 WHEN 'mediumint' THEN 16777215 WHEN 'int' THEN 4294967295 
WHEN 'bigint' THEN 18446744073709551615 END >> IF(LOCATE('unsigned', COLUMN_TYPE) > 0, 0, 1) ) 
as MAX_VALUE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '$DATABASE' AND TABLE_NAME 
= '$TABLE' AND EXTRA='auto_increment'"`"
EN

回答 1

Stack Overflow用户

发布于 2013-11-12 21:21:07

查询INFORMATION_SCHEMA确实需要很长时间,因为对表或统计信息或其他表的查询会导致MySQL分析表中的数据分布,计算平均行大小等。

此分析的开销更多地取决于表的数量,而不是表的大小。它基本上从每个表中读取8个随机页。

您可以禁用自动统计分析的功能,这样I_S查询就不会有太多开销。

代码语言:javascript
复制
SET GLOBAL innodb_stats_on_metadata=0 

在MySQL 5.6中,这是默认配置的,但您也可以自己从MySQL 5.1.7中开始。

另见:模式慢度

FWIW,我还创建了一个脚本来做你正在做的事情。我提供它的GPL,相同的许可使用的MySQL。这里有一个链接:

https://github.com/billkarwin/bk-tools/blob/master/pk-full-ratio.sql

我为所有整数列创建了一个类似的脚本,而不仅仅是自动增量主键列:

https://github.com/billkarwin/bk-tools/blob/master/int-full-ratio.sql

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19939802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档