Простой способ вычислить, насколько близко auto_increment к своему максимальному значению? - PullRequest
3 голосов
/ 05 мая 2010

Итак, вчера у нас была таблица с PK auto_increment для smallint, который достиг своего максимума.Мы должны были изменить таблицу в экстренном порядке, что определенно не так, как нам нравится катиться.

Есть ли простой способ сообщить, насколько близко каждое поле auto_increment, которое мы используем, к своему максимуму?Лучший способ, о котором я могу подумать, - это сделать оператор SHOW CREATE TABLE, разобрать размер автоматически увеличиваемого столбца, а затем сравнить его со значением AUTO_INCREMENT для таблицы.

С другой стороны, учитываячто схема меняется не очень часто, следует ли мне хранить информацию о максимальных значениях столбцов и получать текущее значение AUTO_INCREMENT с SHOW TABLE STATUS?

Ответы [ 4 ]

7 голосов
/ 05 мая 2010

Ваш вопрос мне кажется вполне обоснованным. Вы должны быть в состоянии получить текущие значения автоинкремента для каждой таблицы из information_schema. Я не думаю, что максимальные значения для различных типов int доступны как константы в MySQL, но Роланд Боуман продемонстрировал простой способ их генерации в MySQL:

В SQL как получить максимальное значение для целого числа?

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

Вот быстрый и грязный пример, с которого можно начать:

create temporary table max_int_values
(
int_type varchar(10) not null,
extra varchar(8) not null default '',
max_value bigint unsigned not null,
primary key (int_type,max_value),
key int_type (int_type),
key max_value (max_value)
);

insert into max_int_values(int_type,extra,max_value) values ('tinyint','',~0 >> 57);
insert into max_int_values(int_type,extra,max_value) values ('tinyint','unsigned',~0 >> 56);
insert into max_int_values(int_type,extra,max_value) values ('smallint','',~0 >> 49);
insert into max_int_values(int_type,extra,max_value) values ('smallint','unsigned',~0 >> 48);
insert into max_int_values(int_type,extra,max_value) values ('mediumint','',~0 >> 41);
insert into max_int_values(int_type,extra,max_value) values ('mediumint','unsigned',~0 >> 40);
insert into max_int_values(int_type,extra,max_value) values ('int','',~0 >> 33);
insert into max_int_values(int_type,extra,max_value) values ('int','unsigned',~0 >> 32);
insert into max_int_values(int_type,extra,max_value) values ('bigint','',~0 >> 1);
insert into max_int_values(int_type,extra,max_value) values ('bigint','unsigned',~0);

select t.table_Schema,t.table_name,c.column_name,c.column_type,
  t.auto_increment,m.max_value,
  round((t.auto_increment/m.max_value)*100,2) as pct_of_values_used,
  m.max_value - t.auto_increment as values_left
from information_schema.tables t
  inner join information_schema.columns c 
    on c.table_Schema = t.table_Schema and c.table_name = t.table_name
  inner join max_int_values m 
    on m.int_type = substr(c.column_type,1,length(m.int_type)) 
    and ((m.extra like '%unsigned') = (c.column_type like '%unsigned'))
where c.extra = 'auto_increment'
order by pct_of_values_used;
5 голосов
/ 24 августа 2012

Из openark , вот один запрос для проверки емкости автоинкремента:

SELECT
  TABLE_SCHEMA,
  TABLE_NAME,
  COLUMN_NAME,
  DATA_TYPE,
  COLUMN_TYPE,
  IF(
    LOCATE('unsigned', COLUMN_TYPE) > 0,
    1,
    0
  ) AS IS_UNSIGNED,
  (
    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,
  AUTO_INCREMENT,
  AUTO_INCREMENT / (
    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 AUTO_INCREMENT_RATIO
FROM
  INFORMATION_SCHEMA.COLUMNS
  INNER JOIN INFORMATION_SCHEMA.TABLES USING (TABLE_SCHEMA, TABLE_NAME)
WHERE
  TABLE_SCHEMA NOT IN ('mysql', 'INFORMATION_SCHEMA', 'performance_schema')
  AND EXTRA='auto_increment'
;

И, конечно, вы можете добавить ORDER BY AUTO_INCREMENT_RATIO DESC с возможно LIMIT, чтобы легко выбрать те, которые ближе всего к их пределу.

0 голосов
/ 05 мая 2010

Одним из решений, которое мне удалось найти, было использование консультанта.

LINK

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

но это также позволяет вам Build custom Rules tailored to the needs of your particular MySQL environment. По сути, вы можете создать своего собственного консультанта по мониторингу, который, как я заметил, кто-то делает, но не объяснил, как. для этого вы можете отправить предупреждение, когда ваш лимит вот-вот будет достигнут.

и решением для достижения предела может быть создание еще одного столбца со вторым идентификатором, в результате чего PK станет составным первичным ключом, эффективно увеличивающим количество идентификаторов, которые у вас есть, без необходимости изменения типа данных.

например:

добавить второе поле идентификатора PK под названием «Что угодно»

Допустим, ваш лимит составляет 1024 строки, которые будут добавлены с автоматическим приращением, ваш второй столбец автоматически увеличивается после того, как первый достигнет своего предела, сбрасывает первый на 1 и второй переход на 2

1023 1
1024 1
1    2
2    2
etc.

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

в любом случае, однако вы решаете зафиксировать / проконтролировать достигаемый лимит, и другая база данных должна быть запланирована и создана. монитор или другое поле, или как бы вам ни было нужно быстро починить базу данных, это всего лишь помощь в решении реальной проблемы, потому что если у вас есть другие подобные поля, с небольшими ограничениями, то вы не хотите застрял в тот день, когда более одного поля решает достичь своего лимита одновременно.

надеюсь, это немного поможет.

0 голосов
/ 05 мая 2010

просто оставьте его без знака и навсегда забудьте о его значении.

...