Вы сказали, что «у вас есть ощущение, что некоторые операции записи занимают неприемлемо много времени». Что дает вам это чувство? Вы вообще пробовали измерить это?
Если вы работаете в OS X, dtrace - прекрасный инструмент для измерения такого рода вещей. Некоторые люди выполнили некоторые из работы за вас . По крайней мере, используйте vmstat
, iostat
или iotop
, чтобы определить, наблюдается ли значительное замедление тайминга диска.
Ваш query_cache_size
, вероятно, слишком велик. Записи должны сделать недействительными все записи для этой таблицы из кеша запросов. Чем больше кэш запросов, тем больше времени на это требуется , и это, вероятно, замедляет запись. В мануале рекомендуются «десятки мегабайт». Вы должны постепенно уменьшать его и измерять производительность после каждого изменения, чтобы определить, насколько большим должен быть ваш.
Блокировки таблиц получены немедленно: 100% (3K немедленно / 3K блокировок)
значение предполагает, что MyISAM блокировка стола для вас не проблема. Это может стать серьезной проблемой для таблиц MyISAM, которые имеют более высокое соотношение операций записи и чтения.
Запросы, которые записывают на диск, включаются в отслеживание медленных запросов, поэтому, если вы видите медленные запросы для INSERT, UPDATE, REPLACE, DELETE , TRUNCATE и т. Д., Которые могут указывать на наличие проблемы.
Журнал медленных запросов может быть файлом, таблицей или обоими сразу. Поскольку вы, похоже, не указали для него местоположение, он должен использовать значения по умолчанию. это host_name-slow.log. Сервер создает файл в данных каталог, если не указан абсолютный путь для указания другого каталог.
С учетом этих факторов, которые вы упомянули
Это быстро исключает использование InnoDB, поскольку MySQL 5.0 не имеет InnoDB, который может задействовать несколько ядер (самая старая версия MySQL с InnoDB для задействования нескольких ядер - это подключаемый модуль 5.1.38 InnoDB).
Вы не можете иметь всю базу данных в ОЗУ, потому что MyISAM кэширует только индексы. Однако вы можете загрузить все индексы MyISAM в ключевой буфер.
Первое, что вам нужно сделать, это вычислить key_buffer_size правильного размера. Вот запрос для вычисления этого для вас:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,31),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;
Обратите внимание, что рекомендация ограничится 2 ГБ, если сумма всех индексов MyISAM превышает 2 ГБ. Также обратите внимание: в операторе SQL есть предложение (SELECT 2 PowerOf1024) B
. Это выведет рекомендацию в МБ.
Используя (SELECT 3 PowerOf1024) B
выводит в ГБ.
Хорошо, теперь вы знаете, какой размер сделать буфером ключей 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='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) B
USING (table_schema,table_name)
WHERE 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 db,tb;
Этот запрос покажет вам каждый запрос, который вам нужно выполнить, чтобы принудительно поместить все страницы индекса MYI в ключевой буфер. Выведите этот запрос в сценарий и запустите его:
SQLSTMT="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='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) B USING (table_schema,table_name) WHERE 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 db,tb;"
mysql -u... -p.... -AN -e"${SQLSTMT}" > MyISAMIndexPreload.sql
mysql -u... -p.... -A < MyISAMIndexPreload.sql
Попробуйте !!!
Если у вас 8 ГБ ОЗУ, это не означает, что вся ваша БД помещается в ОЗУ. OS также использует некоторую память для внутренних операций.
Я бы предложил некоторые настройки в my.cnf они могут работать для вас
Increase your `key_buffer` from 384M to some high value may be to 512MB as you have sufficien RAM
Размер ключевого буфера, используемого для кэширования блоков индекса для таблиц MyISAM. Не устанавливайте его больше 30% доступной памяти, так как некоторая память также требуется ОС для кэширования строк. Даже если вы не используете MyISAM, вы все равно должны установить его на 8-64M, так как он также будет используется для внутренних временных дисковых таблиц.
set table_open_cache to 2048
ОБНОВЛЕНИЕ
Для правильной настройки my.cnf посетите optimizating my.cnf
Попробуйте это может вам помочь ...