Запросы быстро после создания индекса, но медленно через несколько минут MySQL - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть несколько таблиц с ~ 15 миллионами строк.Когда я создаю idex для столбца id, а затем выполняю простой запрос, такой как SELECT * FROM my_table WHERE id = 1, я получаю данные в течение одной секунды.Но затем, через несколько минут, если я выполню запрос с другим идентификатором, это займет более 15 секунд.

Я уверен, что это не кэш запроса, потому что я все время пытаюсь использовать разные идентификаторы, чтобыубедитесь, что я не получаю из кеша.Кроме того, я использовал EXPLAIN, чтобы убедиться, что индекс используется.

Спецификации сервера:

CPU: Intel Dual Xeon 5405 Harpertown 2.0Ghz Quad Core
RAM: 8GB
Hard drive 2: 146GB SAS (15k rpm)

Еще одна вещь, которую я заметил, это то, что, если я выполню REPAIR TABLE my_tableзапросы снова становятся в течение одной секунды.Я предполагаю, что что-то кэшируется, либо таблица, либо индекс.Если это так, есть ли способ сказать MySQL, чтобы держать его в кэше.С учетом спецификаций сервера это нормально, что на индексированную таблицу уходит около 13 секунд?Индекс не является уникальным, и каждый запрос возвращает около 3000 строк.

ПРИМЕЧАНИЕ. Я использую MyISAM и знаю, что в этих таблицах не будет записей, все запросы будут считывать данные.

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

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Пожалуйста, укажите

SHOW CREATE TABLE
SHOW VARIABLES LIKE '%buffer%';

Вероятные причины:

  • key_buffer_size (при использовании MyISAM) - не 20% ОЗУ;или innodb_buffer_pool_size - это не 70% доступной оперативной памяти (при использовании InnoDB).
  • Входит другой запрос (или группа запросов), который «выбрасывает кэш» (key_buffer или buffer_pool).Ищите такие запросы).
  • При использовании InnoDB у вас нет PRIMARY KEY.(Это действительно важно иметь.)

Для 3000 строк, чтобы загрузить 15 секунд, я выводлю:

  • Кэш для таблицы (не обязательно дляиндекс) был взорван, и
  • 3000 строк были разбросаны по всей таблице (следовательно, выборка одной строки не очень помогает в поиске последующих строк).

Блог выделения памяти:http://mysql.rjweb.org/doc.php/memory

0 голосов
/ 03 февраля 2019

Это нормально, учитывая спецификации сервера, занимать около 13 секунд для индексированной таблицы?

Высокая разница во времени отклика указывает, что что-то не так.При наличии только 8 ГБ ОЗУ и 15 миллионов строк у вас может не хватить ОЗУ для хранения индекса в памяти.

Включена ли подкачка на сервере?Это может объяснить экстремальный скачок времени отклика.

Изучить ситуацию с памятью с помощью такого инструмента, как top, htop или glances.

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