InnoDB Buffer Pool и его стабильность

Взялись оптимизировать работу с БД, разобрались с индексами, теперь практически все запросы идут с Using where.

Проблема в том, что отрабатывают они быстро только при условии выгрузки главной таблицы в пул (нас в основном интересует одна таблица размером в 1Гб и 1млн. записей), узнаю я о том, что таблица выгружается в пул по стрекотанию харда.
Рядовой запрос с выгрузкой в пул (например, после перезапуска mysql) может выполняться и 60-70 секунд, что будет категорически неприемлемо для продакшна. Последующие разные запросы из той же таблицы уже отрабатывают за приемлемые 0.3-0.8 сек.

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

Вопрос 1 — а вообще нормально, что запрос с Using where по таблице не в пуле выполняется 60-70 секунд?
Вопрос 2 — что можно сделать с проблемой выгрузки таблицы из пула?
  • Вопрос задан
  • 9842 просмотра
Пригласить эксперта
Ответы на вопрос 7
AxisPod
@AxisPod
Это специфика работы InnoDB хранилища, хотите быстрые выборки, используйте MyISAM.
Ответ написан
vsespb
@vsespb
Проблема в том, что отрабатывают они быстро только при условии выгрузки главной таблицы в пул (нас в основном интересует одна таблица размером в 1Гб и 1млн. записей),

Я всегда считал, что в оперативной памяти должны быть все индексы, а не вся таблица. Иначе это была бы полная глупость. Откуда уверенность что вся таблица читается? Может у Вас просто большие индексы и мало памяти?

Проблема усугубляется тем, что периодически (вроде как после какого-то времени простоя) таблица оказывается выгруженной из пула, и читается туда снова

А во время простоя запросы к другим таблицам не делаете? Есть ли таблицы с огромными блобами (типа, файлы в базе храните)?
Ответ написан
@Xeenon
В MariaDB 10.0 есть очень интересная фича engine independent table statistics.

Может помочь.
Но тут сильно зависит от данных (как часто обновляются, какая сardinality) и запроса (сколько в запросе используется таблиц и т.п.).
Ответ написан
Комментировать
@Masterme
На случай, если проблему решить не сможете — попробуйте сделать денормализацию — разбить таблицу на две. В одной оставьте столбцы, необходимые для выполнения запроса, в другой остальные. Тогда загружаться будет не гиг, а меньше. Да, в логику приложения придётся внести изменения.
Ответ написан
Комментировать
@Masterme
Вероятные проблемы:

— не хватает оперативы для кэш ОС либо неоптимальное (двойное либо наоборот одинарное) кэширование файлов таблиц mysql либо просто не хватает оперативы под буфера mysql. попробуйте уменьшить innodb_buffer_pool_size до 4х или 3х гигов. ещё у вас отводится память под myisam, key_buffer_size — полтора гига. оно действительно нужно? если не используете myisam — отключите его совсем

— почему винт стрекочет? у вас наверное вся база в одном файле, а внутри этого файла ваша таблица может быть фрагментирована. попробуйте с параметром innodb_file_per_table=1. нужно будет выгрузить базу в бэкап и восстановить, чтобы файлы таблиц пересоздались. также нужно будет увеличить параметр open-files-limit в секции [mysqld]. затем можно этот файл дефрагментировать. эта мера сделает чтение гиговой таблицы более «гладким»
forums.cpanel.net/f43/innodb_file_per_table-converting-per-table-data-innodb-167942.html
stackoverflow.com/questions/3927690/howto-clean-a-mysql-innodb-storage-engine/4056261#4056261
dba.stackexchange.com/questions/15531/why-does-innodb-store-all-databases-in-one-file
Ответ написан
@Masterme
И ещё добавлю. Using where означает неоптимальное построение индексов. При правильном запросе и правильном построении индексов мускулу не требуется загружать всю таблицу, достаточно загрузить только индекс. Покажите структуру таблицы и проблемный запрос.
Я бы начал с этой меры в первую очередь.
Ответ написан
opium
@opium
Просто люблю качественно работать
Примеры запросов в студию, все таки засунуть все в память хорошо, но опять таки если все таблицы иннодб влезают, если их у вас больше чем буфер то понятно откуда идет вытеснение.
А прикрутить индексы не удалось к запросам?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы