根据插入率预测MySQL中的主键耗尽

时间:2019-05-30 21:55:55

标签: mysql primary-key limit

我们的产品表中的主键用完了。我们不希望这种情况再次发生。因此,我们需要一种机制来根据插入速率在主键用尽时向我们发出警报,从而减轻这种情况。

我编写了一个Jenkins作业,该作业运行并在Information模式上执行查询,并从MySQL数据库中提取索引长度,表行和auto_increment。但是我们需要跟踪先前的读数,因为我们想与当前读数进行比较,以便预测何时将耗尽键。

        SELECT 
        INDEX_LENGTH, TABLE_NAME, AUTO_INCREMENT, TABLE_ROWS 
        FROM 
        information_schema.TABLES 
        ORDER BY 
        index_length DESC;

我找不到与Mysql表中的变化率有关的任何东西,这些变化应该可以预测主键的使用率。如果有人想到一种方法,我也愿意使用任何替代方法,但是请记住,我必须让cron作业或Jenkins作业运行一个查询,该查询应告诉您哪些表将在今年年底用尽。 / p>

2 个答案:

答案 0 :(得分:0)

您可以简单地创建一个表来存储指标,当前正在检索的值以及时间戳记

    INSERT INTO table_metrics(index_length, table_name, auto_increment, row_count, when)
    SELECT INDEX_LENGTH, TABLE_NAME, AUTO_INCREMENT, TABLE_ROWS, now()
    FROM information_schema.TABLES 
    ;

然后对数据进行查询

SELECT table_name
    , il_change / daysPassed AS ilGrowthRate
    , ([literal ceiling value] - il_current) / (il_change / daysPassed) AS daysRemaining
    , ...
FROM (
SELECT table_name
    , MAX(index_length) AS il_current
    , MAX(index_length) - MIN(index_length) AS il_change
    , ....
    , DATEDIFF(MAX(when), MIN(when)) AS daysPassed
GROUP BY table_name
) AS subQ

这假定您在截断表时删除了表的数据,以使度量从表开始时就重新开始;您当然可以添加条件,仅查看最后一天,一周,一个月等的指标(在这种情况下,清除后删除指标表的重要性就降低了。)

答案 1 :(得分:0)

找到相关查询以获取已用完的自动增量的百分比。请参见this链接和评论部分。

SELECT table_schema, table_name, column_name, column_type, auto_increment,max_int,ROUND(auto_increment/max_int*100,2) AS “USED %” FROM
    (SELECT table_schema, table_name, column_name, column_type, auto_increment,
    pow(2, case data_type
    when ‘tinyint’ then 7
    when ‘smallint’ then 15
    when ‘mediumint’ then 23
    when ‘int’ then 31
    when ‘bigint’ then 63
    end+(column_type like ‘% unsigned’))-1 as max_int
    FROM information_schema.tables t
    JOIN information_schema.columns c USING (table_schema,table_name)
    WHERE t.table_schema not in (‘mysql’,’information_schema’,’performance_schema’) and t.table_type = ‘base table’
    and c.extra = ‘auto_increment’ AND t.auto_increment IS NOT NULL order by auto_increment desc limit 10) TMP;