Прогнозирование исчерпания первичных ключей в MySQL на основе скорости вставки - PullRequest
0 голосов
/ 31 мая 2019

У нас заканчиваются первичные ключи для нашей таблицы в prod.Мы не хотим, чтобы это повторилось.Поэтому нам нужен механизм, чтобы предупредить нас, когда у нас заканчиваются первичные ключи, в зависимости от скорости вставки, чтобы мы могли уменьшить это.

Я написал задание Jenkins, которое запускает и выполняет запрос к информационной схемеи извлекает длину индекса, строки таблицы и auto_increment из базы данных MySQL.Но нам нужно отслеживать предыдущее чтение, так как мы хотим взять его разность с текущим, чтобы предсказать, когда ключи будут исчерпаны.

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

Я не могу найти ничего, связанного сскорость изменения в таблицах Mysql, которая должна прогнозировать скорость, с которой используются первичные ключи.Я также открыт для использования любого хорошего альтернативного подхода, если кто-то думает об этом, но имейте в виду, что я должен получить запрос, выполняемый заданием cron или заданием Jenkins, который должен сообщить, какие таблицы будут исчерпаны в конце этого года.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Найден связанный запрос, чтобы получить процент использованных автоматических приращений. См. эту ссылку и в разделе комментариев.

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;
0 голосов
/ 31 мая 2019

Вы можете просто создать таблицу для хранения метрик, значений, которые вы в настоящее время извлекаете вместе с отметкой времени

    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

Предполагается, что вы удаляете данные для таблицы при ее усечении, чтобы метрики начинались заново, когда таблица выполняется; Вы можете, конечно, добавить условия, чтобы просматривать показатели только за последний день, неделю, месяц и т. д. (в этом случае сокращение таблицы показателей после очистки становится менее важным).

...