SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.08.2008 20:23:21

slakey
Участник
Зарегистрирован: 20.06.2008
Сообщений: 16

show table status - медленно для таблиц InnoDB

Некоторое время назад я перешёл на таблицы InnoDB и через некоторое время заметил такую особенность - очень долго выполняется команда "show table status". Ну я решил пройтись по всем таблицам и выяснилось, что долго эта команда выполняется для больших (ну в моих масштабах) таблиц InnoDB.
Долго - это от 0.5 секунды для таблицы, которая занимает 150 мегабайт и в ней 2.5 миллиона записей. Другая таблица InnoDB, но в которой всего 5000 записей - моментально.
Можно как-то на это повлиять, или это нормально?

Неактивен

 

#2 23.08.2008 12:21:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: show table status - медленно для таблиц InnoDB

В документации такое поведение не описано и из логики Innodb этого не следует.  Попробуйте написать на bugs.mysql.com, возможно это признают багой или скажут как обойти.

Неактивен

 

#3 01.10.2008 07:18:23

Kassad
Участник
Зарегистрирован: 01.10.2008
Сообщений: 10

Re: show table status - медленно для таблиц InnoDB

Такая же штука.

Постепенно нагрузка увеличивалась и я решил сконвертировать базы в InnoDB. Остался доволен, однако в slow.log начали падать запросы вида: "SHOW TABLE STATUS FROM ***", некоторые даже до 6 секунд доходят, причём это происходит для таблиц InnoDB и MyIsam, а особенно если листать information_schema. Раньше вроде этого не было или я не замечал.

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

Неактивен

 

#4 01.10.2008 10:21:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: show table status - медленно для таблиц InnoDB

Системные базы обычно небольшие, в базе mysql лежат права доступа, а INORMATION_SCHEMA вообще не хранится нигде (это метабаза).

Неактивен

 

#5 01.10.2008 10:32:25

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: show table status - медленно для таблиц InnoDB

Я думаю, нужно задуматься о том, из чего состоит выполнение запроса SHOW TABLE STATUS с точки зрения сервера.

Может, дело в том, что таблицы с дырками, и какая-нибудь операция выполняется медленно?

Неактивен

 

#6 01.10.2008 19:59:13

Kassad
Участник
Зарегистрирован: 01.10.2008
Сообщений: 10

Re: show table status - медленно для таблиц InnoDB

База mysql явно ни при чём, а про information_schema не соглашусь. Она хоть и метабаза, но использует движки Myisam и MEMERY для своих таблиц, хотя это скорее всего и не при чём. Сейчас падают в slow.log два вида запросов и как написал LazY, интересен механизм их работы: SELECT COUNT(*) FROM и SHOW TABLE STATUS FROM. О чём этого говорит мне не понятно, может памяти не хватает.

Немного оффтопа. Из-за чего information_schema вообще так тормозит? SELECT COUNT(*) FROM `information_schema`. COLUMNS обязательно занимает 2-3 секунды, выборка 30 значений из этой базы 0.5 секунд, правда получение 10000 значений около 1 секунды. Такое замечается со всей базой information_schema. Как-то не нормально и для других баз этого не наблюдается.

Неактивен

 

#7 01.10.2008 20:06:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: show table status - медленно для таблиц InnoDB

А база нагружена? Что показывает SHOW FULL PROCESSLIST?

count(*) может медленно работать на Innodb, так как требуется полный скан таблицы

Неактивен

 

#8 01.10.2008 20:18:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: show table status - медленно для таблиц InnoDB

INFORMATION_SCHEMA - все-таки, виртуальная база, она НЕ MyISAM, НЕ MEMORY и НЕ InnoDB.
Запрос тормозит, потому что приходится делать SHOW TABLE STATUS.

Неактивен

 

#9 01.10.2008 21:00:18

Kassad
Участник
Зарегистрирован: 01.10.2008
Сообщений: 10

Re: show table status - медленно для таблиц InnoDB

rgbeast написал:

А база нагружена? Что показывает SHOW FULL PROCESSLIST?

count(*) может медленно работать на Innodb, так как требуется полный скан таблицы

Сервер не нагружен, нагрузка процессора до 5%. Раньше было очень много sleep'ов, потом поставил 120 секунд таймаут и процессов доходит где-то до 50, а в среднем и то меньше. Кстати на производительности это никак не сказалось.

Про полный скан знаю, но неужели нет способа уменьшить это время. Плюс в основном count(*) тормозит для information_schema, это вообще не критично, естественно, но проблема имеет место.

paulus написал:

INFORMATION_SCHEMA - все-таки, виртуальная база, она НЕ MyISAM, НЕ MEMORY и НЕ InnoDB.
Запрос тормозит, потому что приходится делать SHOW TABLE STATUS.

Выполните запрос для базы information_schema:

SELECT `TABLE_NAME`,`ENGINE` FROM `TABLES` WHERE `TABLE_SCHEMA` LIKE 'information_schema'

То там будет явно указан тип ENGINE таблиц information_schema. Это просто так?

Отредактированно Kassad (01.10.2008 21:03:29)

Неактивен

 

#10 01.10.2008 21:08:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: show table status - медленно для таблиц InnoDB

Тип ENGINE таблиц - это просто так, так как таблица без типа быть не может. Замечена следующая закономерность, если в таблице есть BLOB-поля, то она отображается как MyISAM, иначе, как MEMORY.

Неактивен

 

#11 02.10.2008 22:11:22

Kassad
Участник
Зарегистрирован: 01.10.2008
Сообщений: 10

Re: show table status - медленно для таблиц InnoDB

Тестировал ночью. Попробовал сегодня запустить сервер с NO_ENGINE_SUBSTITUTION. За день ни одного медленного запроса, хм, совпадение или... Честно говоря не вижу связи.

Неактивен

 

#12 03.10.2008 10:34:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: show table status - медленно для таблиц InnoDB

Насколько я понимаю, NO_ENGINE_SUBSTITUTION может влиять на поведение сервера,
при создании таблиц. Но в любом случае это никак не отразится на производительности,
конечно же smile

btw, Вы перегрузили сервер, может быть, дело в этом?

Неактивен

 

#13 03.10.2008 19:50:09

Kassad
Участник
Зарегистрирован: 01.10.2008
Сообщений: 10

Re: show table status - медленно для таблиц InnoDB

Дело точно не в том, что я перезагрузил mysql (не сервер). Если нет одназначного ответа, то не будем гадать на кофейной гуще, на самом деле может быть сотня причин, я даже немного удивился, что вы не спросили версию mysql и конфиг, кстати версия mysql 5.0.45. В общем, меня сейчас интересует один вопрос, почему же эта information_schema такая медленная и есть ли варианты исправления? Ну не дело запросы по 0.5-4 секунды выполнять для этой базы. Что касается count(*) и статуса, то я в принципе ими доволен. За 2 последние дня был только 1 медленный зпрос count(*) на таблицу с 200000 записями, который занял 3 секунды, что в глобальных масштабах приемлимо.

Возвращаясь к NO_ENGINE_SUBSTITUTION, у меня на сервере достаточно высокий показатель Created_tmp_tables, может это влияет, да и Created_tmp_disk_tables не 0 (запись временных таблиц на диск), вероятно тут задержки были, да и есть. Плюс кто-то из пользователей мог движок поменять в этот момент, запросы другие и т.д., уже не понять точную картину. Но всё равно как-то шустрей стало.

Неактивен

 

#14 06.10.2008 13:34:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: show table status - медленно для таблиц InnoDB

Версию сервера имеет смысл спрашивать тогда, когда налицо бага. А тут баги нет - Вы шаманите
над медленными запросами smile

Неактивен

 

#15 06.10.2008 16:41:47

Kassad
Участник
Зарегистрирован: 01.10.2008
Сообщений: 10

Re: show table status - медленно для таблиц InnoDB

Это вы опрометчиво. Всё вышеперичленное бага, после долгих поисков и тестов я нашёл ответы на свои вопосы в листе багов на официальном сайте. Обновился до 5.1.28 и всё стало отлично. Увеличение Created_tmp_tables это баг, когда счётчик увеличивается как раз при вызове show table status и некоторых других моментах, честно говоря не вникал особо. Запрсы вида count(*) и show table status стали на порядок лучше работать, хотя ещё скрепя сердце увеличил буфферный пул и некоторые другие настройки, но это как бонус.

NO_ENGINE_SUBSTITUTION был не при чём, просто повезло 2 дня после его прописи. information_schema у меня не тормозит с дефолтным движком myisam и нормальными под него настройками, при InnoDB как тормозила, так и тормозит, ну и фиг с ней. Видимо тоже баг.

Неактивен

 

#16 06.10.2008 17:15:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: show table status - медленно для таблиц InnoDB

Хорошо, не буду спорить, каждый остался при своем мнении smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson