Подтвердить что ты не робот

Как предварительно загружать таблицы в буферный пул INNODB с помощью MySQL?

У меня есть приложение для электронной коммерции, которое использует MySQL, и я бы хотел, чтобы оно было быстрее. Когда доступ к части # осуществляется на веб-сайте, к которому был осуществлен доступ, часть загружается быстро, потому что все необходимые данные уже находятся в пуле буферов INNODB. Однако, если часть # никогда не была загружена раньше, эти данные еще не находятся в пуле буферов, поэтому ее нужно читать с диска, и это медленно. Я установил свой буферный пул INNODB в 2 ГБ, и вся эта база данных составляет всего около 350 МБ, поэтому есть достаточно места для загрузки всей базы данных в пуле буферов. Из статистики INNODB видно, что сейчас используется только половина пула буферов.

Я нашел ссылки на предварительную загрузку данных, также известную как "разогрев" буферного пула, например Быстрая предварительная загрузка таблиц Innodb в буферный пул или mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole.html. Стратегия в основном предусматривает принудительное сканирование таблицы для каждой таблицы, поскольку MySQL не имеет собственного способа предварительной загрузки данных.

Я не хочу вручную создавать script, который перечисляет каждую отдельную таблицу в моей базе данных и должен это делать. Как я могу создать script, который проходит и автоматически выбирает для каждой таблицы, и автоматически выбирает неиндексированный столбец, чтобы выполнить сканирование таблицы?

4b9b3361

Ответ 1

Это должно дать вам список запущенных запросов;)

SELECT 
  CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL')
FROM
  information_schema.COLUMNS AS c
LEFT JOIN (
  SELECT DISTINCT
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME
  FROM
    information_schema.KEY_COLUMN_USAGE
) AS k
USING
  (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME)
WHERE
  c.TABLE_SCHEMA = 'yourDatabase'
  AND k.COLUMN_NAME IS NULL
GROUP BY
  c.TABLE_NAME

Вы можете поместить его в хранимую процедуру и перебрать набор результатов с помощью курсора. Создайте подготовленный оператор из каждой строки и выполните.

Ответ 2

Этот запрос вернет имена таблиц в вашей базе данных, поэтому вам не нужно вводить их вручную:

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name'

Затем для каждой таблицы сканирование таблицы действий.