На вашем месте я бы переключил все данные на InnoDB. Таблица блокировки / блокировки строк давно обсуждается многими. Я бы всегда выбирал InnoDB руками. Однако есть и другая серьезная причина выбрать InnoDB ... CACHING .
Хотя большинство людей хвастаются тем, что MyISAM быстрее для чтения, большинство людей забывают, что многопользовательский кеш для MyISAM, который называется кешем ключей (устанавливается key_buffer_size), кэширует только страницы индекса из файлов .MYI. Он никогда не кэширует страницы данных. Он имеет официальный максимум 4 ГБ в 32-битных системах. 8 ГБ - лучший максимум для 64-разрядных.
InnoDB Buffer Pool кэширует данные и страницы индекса. В зависимости от вашего сервера, вы можете кэшировать до всего набора данных в оперативной памяти. Вы можете настроить InnoDB для оперативной памяти до 80% и 10% для подключений к БД, и оставить 10% для ОС. Это верно даже для разных операционных систем .
Я рекомендовал эти вещи для клиентов Drupal с удивительным успехом. Это относится и к Wordpress . Я обеспечил поддержку БД для клиентов с WordPress. Те же улучшения.
Вы всегда можете настроить память для InnoDB более эффективно, чем больше MyISAM. Всегда есть способ настроить InnoDB в соответствии с вашими требованиями к производительности . По мере роста ваших данных это в конечном итоге станет требованием .
ОБНОВЛЕНИЕ 2011-11-21 11:44 EST
Если ваш полный набор данных достаточно мал, вы можете выполнить запрос SELECT для каждой таблицы, которая у вас есть, сразу после запуска mysql.
Для всех таблиц, которые являются InnoDB и / или MyISAM, выполните этот запрос:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')) B
USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
Это выведет каждый возможный запрос SELECT, который вам нужно выполнить, который вызовет все индексы, на которые нужно сослаться. Поместите этот запрос в файл с именем /root/MakeSelectQueriesToLoad.sql. Запустите сценарий и соберите выходные данные /root/SelectQueriesToLoad.sql. Наконец, запустите это:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Это определенно предварительно загрузит все страницы индекса в пул буферов InnoDB и кэш-память ключей MyISAM. Если все ваши данные InnoDB, внесите два изменения:
- заменить
WHERE engine IN ('InnoDB','MyISAM')
наWHERE engine='InnoDB'
- заменить
CONCAT('SELECT ',ndxcollist,' FROM ',
наCONCAT('SELECT * FROM ',
Это также заполнит больше страниц данных в пуле буферов InnoDB.
ЗАКЛЮЧИТЕЛЬНОЕ ПРИМЕЧАНИЕ: убедитесь, что буферный пул InnoDB достаточно большой, чтобы вместить все ваши данные InnoDB