настройка производительности mysql, запишите, получите дб в поршень

Пойдите с L3 для базового переключения. L2 хороши для определенных целей, но они немного больше, чем неуправляемые переключатели. L3 (или L4) позволит направлять, ACLs на многих моделях и более гибкие сетевые решения.

3
задан 9 February 2012 в 11:37
3 ответа

Вы сказали, что «у вас есть ощущение, что некоторые операции записи занимают неприемлемо много времени». Что дает вам это чувство? Вы вообще пробовали измерить это?

Если вы работаете в OS X, dtrace - прекрасный инструмент для измерения такого рода вещей. Некоторые люди выполнили некоторые из работы за вас . По крайней мере, используйте vmstat , iostat или iotop , чтобы определить, наблюдается ли значительное замедление тайминга диска.

Ваш query_cache_size , вероятно, слишком велик. Записи должны сделать недействительными все записи для этой таблицы из кеша запросов. Чем больше кэш запросов, тем больше времени на это требуется , и это, вероятно, замедляет запись. В мануале рекомендуются «десятки мегабайт». Вы должны постепенно уменьшать его и измерять производительность после каждого изменения, чтобы определить, насколько большим должен быть ваш.

Блокировки таблиц получены немедленно: 100% (3K немедленно / 3K блокировок) значение предполагает, что MyISAM блокировка стола для вас не проблема. Это может стать серьезной проблемой для таблиц MyISAM, которые имеют более высокое соотношение операций записи и чтения.

Запросы, которые записывают на диск, включаются в отслеживание медленных запросов, поэтому, если вы видите медленные запросы для INSERT, UPDATE, REPLACE, DELETE , TRUNCATE и т. Д., Которые могут указывать на наличие проблемы.

Журнал медленных запросов может быть файлом, таблицей или обоими сразу. Поскольку вы, похоже, не указали для него местоположение, он должен использовать значения по умолчанию. это host_name-slow.log. Сервер создает файл в данных каталог, если не указан абсолютный путь для указания другого каталог.

2
ответ дан 3 December 2019 в 05:47

С учетом этих факторов, которые вы упомянули

  • MySQL 5.0.92
  • 32-разрядная ОС

Это быстро исключает использование 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

Попробуйте !!!

2
ответ дан 3 December 2019 в 05:47

Если у вас 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

Попробуйте это может вам помочь ...

1
ответ дан 3 December 2019 в 05:47

Теги

Похожие вопросы