У меня есть приложение электронной коммерции, использующее MySQL, и я бы хотел, чтобы оно было быстрее. При обращении к части # на веб-сайте, к которому ранее обращались, эта часть быстро загружается, поскольку все необходимые данные уже находятся в пуле буферов INNODB. Однако, если part # никогда не загружался ранее, эти данные еще не находятся в пуле буферов, поэтому их нужно читать с диска, и это медленно. Я установил буферный пул INNODB на 2 ГБ, а вся эта база данных - всего около 350 МБ, поэтому есть достаточно места для загрузки всей базы данных в пул буферов. По статистике INNODB я вижу, что сейчас используется только около половины пула буферов.
Я нашел ссылки на предварительную загрузку данных, также известную как «прогрев» пула буферов, такие как Быстрая предварительная загрузка таблиц Innodb в пул буферов или mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole.html. Стратегия в основном предусматривает принудительное сканирование таблицы для каждой таблицы, поскольку MySQL не имеет встроенного способа предварительной загрузки данных.
Я не хочу вручную создавать сценарий, который перечисляет каждую таблицу в моей базе данных и должен выполнить это. Как я могу создать сценарий, который автоматически выполняет выбор для каждой таблицы и автоматически выбирает неиндексированный столбец, чтобы выполнить сканирование таблицы?
Этот запрос вернет имена таблиц в вашей базе данных, поэтому вам не нужно вводить их вручную:
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name'
Затем для каждого имени таблицы принудительное сканирование таблицы.
Это должно дать вам список запросов для выполнения;)
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
Вы можете поместить его в хранимую процедуру и пройти по набору результатов с помощью курсора. Создайте подготовленный оператор из каждой строки и выполните.