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

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

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

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

Ответы [ 2 ]

25 голосов
/ 07 августа 2010

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

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

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

0 голосов
/ 07 августа 2010

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

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

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

...