2016-12-20 3 views
0

Запрос на * from information_schema.tables очень медленный. Innodb_stats_on_metadata выключен, и выберите table_name из таблиц быстро, просто выбрав несколько полей очень медленно (12 минут!)Выбирайте из таблицы information_schema очень медленно

mysql> select * from tables limit 1; 
+---------------+--------------------+----------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+ 
| TABLE_CATALOG | TABLE_SCHEMA  | TABLE_NAME  | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME   | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT | 
+---------------+--------------------+----------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+ 
| def   | information_schema | CHARACTER_SETS | SYSTEM VIEW | MEMORY |  10 | Fixed  |  NULL |   384 |   0 |  32869632 |   0 |   0 |   NULL | 2016-12-19 23:55:46 | NULL  | NULL  | utf8_general_ci |  NULL | max_rows=87381 |    | 
+---------------+--------------------+----------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+ 
1 row in set (**12 min 27.02 sec**) 

Дополнительная информация:

mysql> select count(*) from tables; 
+----------+ 
| count(*) | 
+----------+ 
| 194196 | 
+----------+ 
1 row in set (0.57 sec) 
mysql> show global variables like '%innodb%metada%'; 
+--------------------------+-------+ 
| Variable_name   | Value | 
+--------------------------+-------+ 
| innodb_stats_on_metadata | OFF | 
+--------------------------+-------+ 
1 row in set (0.00 sec) 
+0

194196 столы, действительно? – Sebas

ответ

0

Даже в 5.7 информация о таблицах разбросана в файлах на диске. Чтение файлов 200K занимает много времени.

Это одна из причин, почему столы 200K не являются хорошим дизайном. Другие причины связаны с кешированием - существуют практические ограничения на такие.

Из-за кэширования вы увидите варианты таймингов запросов I_S.

Совет: передумайте дизайн своей схемы.

8.0 Хранит всю эту информацию в таблице InnoDB, поэтому она будет значительно быстрее.

+0

Существует более 4000 баз данных (~ 50 таблиц на каждый бит), db для каждого клиента, трудно спроектировать что-либо гораздо лучше на текущей инфра-временной основе, никаких проблем, кроме этого длительного выбора * из таблиц. Но u может быть прав, что проблема в том, что он читает каждый файл и получает метаданные –

1

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

Таблицы в information_schema не являются реальными таблицами. Они являются внутренними серверами, открытыми через интерфейс SQL, в некоторых случаях позволяя вам запрашивать информацию, которую сервер не хранит, и должен вычислять или собирать, потому что вы просили. Код сервера знает, какие столбцы вы запрашиваете, и только собирает эту информацию.

LIMIT 1 не помогает, поскольку Information_schema не обрабатывает LIMIT, как и следовало ожидать - вся таблица отображается в памяти до того, как первая строка будет возвращена, а остальные будут отброшены.

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