无需点击INFORMATION_SCHEMA即可获取AUTO_INCREMENT

时间:2013-11-12 21:00:54

标签: mysql limit increment auto-increment

我已被分配创建一个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而不会访问信息架构表但我看不清楚如何。有什么想法吗?

这就是我获取数据类型的方式

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'"`"

这是我获取列可以处理的最大值的方法:

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'"`"

1 个答案:

答案 0 :(得分:1)

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

此分析的开销与表的 number 有关,而不是表的大小。它基本上从每个表中读取8个随机页面。

您可以禁用自动统计分析的功能,以便I_S查询在没有太多开销的情况下运行。

SET GLOBAL innodb_stats_on_metadata=0 

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

另请参阅:Solving INFORMATION_SCHEMA slowness

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