2013-11-12 2 views
1

Мне назначили создать сценарий bash, который проверяет, приближается ли столбец AUTO_INCREMENT к его пределу. Я решил, что лучший способ сделать это - получить «Текущее значение автоматического увеличения» и сравнить с «типом данных поддерживаемого столбца с максимальным значением» (скажем, 255 для tinyint).Получить AUTO_INCREMENT без удара INFORMATION_SCHEMA

У нас есть около 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'"`" 
+0

@thinkswan может быть, вы можете помочь – andresg3

ответ

1

Запрос на INFORMATION_SCHEMA действительно занимает много времени, так как запрос к ТАБЛИЦАМ или СТАТИСТИКЕ или некоторые другие таблицы заставляет MySQL анализировать распределение данных в таблице, вычислять средний размер строки и т. д.

Сумма накладных расходов этого анализа имеет больше общего с номер таблиц, а не размер таблиц. Он в основном считывает 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

+0

Пожалуйста, помогите: HTTP: //stackoverflow.com/questions/21393700/the-variable-inside-while-loop-is-not-remembered-mysql-bash-script-auto-increme – andresg3

Смежные вопросы