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

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

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

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

10
задан Brian Tompsett - 汤莱恩 8 June 2017 в 18:04
поделиться

2 ответа

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

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

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

0
ответ дан 3 December 2019 в 16:08
поделиться

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

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

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

26
ответ дан 3 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: