Якби я був ти, я переключив би всі дані на InnoDB. Блокування таблиць / блокування рядків вже давно обговорюється багатьма. Я б завжди вибирав InnoDB руками вниз. Однак є ще одна глибока причина вибору InnoDB ... КАЧІННЯ .
Хоча більшість людей похвалиться тим, що MyISAM швидше читає, більшість людей забувають, що багато кеш-пам'яті для MyISAM, який називається кеш-ключем (встановлений key_buffer_size), кешують лише індексні сторінки з файлів .MYI. Він ніколи не кешує сторінки даних. Він має офіційний максимум 4 Гб в 32-бітних системах. 8 ГБ - найкращий максимум для 64-розрядних.
Пул буфера InnoDB кешує сторінки даних та покажчики. Залежно від вашого сервера, ви можете кешувати до всього набору даних в оперативній пам'яті. Ви можете налаштувати 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