Administrators/Optimize performance/MySQL/ru

Регулярный анализ и оптимизация кеша таблиц
MySQL использует индексы лучше всего подходящие для выполнения запроса и решения о мощности индекса. Индексы с большей мощностью предпочтительнее индексов с меньшей. Проблемы возникают при неверной мощности и, особенно таблица mshop_catalog_index_text MyISAM с полнотекстовым индексом уязвима для этого. Поэтому хорошо бы периодически проверять значения мощности в таблицах mshop_catalog_index_*, особенно, если кажется, что скорость поиска снизилась, в то время как количество товаров выросло незначительно.

Чтобы избавиться от этой проблемы, необходимо выполнить MySQL запрос

ANALYZE TABLE "table name"

и, если это не поможет, выполнить запрос MySQL

OPTIMIZE TABLE "table name"

Запросы также выполняются после окончания перестроения индекса.

Замечание: поосторожнее с "OPTIMIZE TABLE", если в магазине значительно количество записей в этих таблицах индексов, так как во время выполнения запроса, производительность сайта очень сильно падает.

Оптимизация настроек сервера MySQL при необходимости
В зависимости от размера базы данных и количества записей в различных таблицах, может понадобиться адаптировать некоторые настройки сервера MySQL для получения максимальной скорости от Arcavias.

Проще всего выявить проблемы, вызванные, например, слишком малыми буферами, это вкладка "Статус/Status" (или в старых версиях ссылка "Показать информацию о выполнении MySQL/Show MySQL runtime information") на домашнем экране phpMyAdmin. Здесь выведены различные переменные сервера, которые можно изменить, их значения и описания зачастую имеют подсказку для этого. Самое замечательное здесь то, что phpMyAdmin подсвечивает красным значения, которые могут быть источником проблем.

Особенно внимательно посмотрите на следующие ключи:
 * Created_tmp_disk_tables : количество временных таблиц, записываемых на диск из-за слишком маленького размера буфера. Смотрите на tmp_table_size если проблемы случались уже несколько раз.
 * Innodb_buffer_pool_reads : сколько раз данные индекса приходилось считывать с жёсткого диска из за того, что они не были кешированы в памяти. Большие значения могут говорить о необходимости увеличения значения для innodb_buffer_pool_size.
 * Qcache_lowmem_prunes : количество запросов, которые понадобилось удалить из кеша запросов из-за отсутствия свободного места. Если значение высоко, попытайтесь увеличить значение query_cache_size.
 * Slow_queries : количество запросов, занявших больше времени, чем указано (в секундах). Если значение высоко, то либо сервер слишком слаб для количества пользователей, одновременно посетивших сайт, либо часто выполняются медленные запросы. В последнем случае проверьте, не установлены ли для Arcavias плохо масштабируемые расширения, которые и могут вызывать проблемы производительности.
 * Sort_merge_passes : Количество проходов, вынужденно сделанных алгоритмом сортировки. Высокие значения могут быть намеком на увеличение sort_buffer_size.

Стоит поискать данные по следующим переменным MySQL:
 * innodb_buffer_pool_size : чем выше это значение, тем больше данных и индексов доступно в памяти, что намного быстрее, чем считывать их с жёсткого диска.
 * query_cache_size : чем выше это значение, тем больше запросов может быть обслужено напрямую, без обращения к жёсткому диску.
 * sort_buffer_size : размер буфера, доступного для наборов результатов сортировки, если невозможно использование индексов.
 * tmp_table_size : размер буфера в памяти для временных таблиц, прежде чем они будут записаны на жёсткий диск.

Хранение всех индексов в памяти
Если имеется достаточно RAM, можно попытаться хранить все индексы в памяти, чтобы свести к минимуму обращение к жёсткому диску. В любом случае, проверьте, что key_buffer_size + innodb_buffer_pool_size не занимают более 75% доступной RAM, и остаётся доступная RAM для соединений базы данных и операционной системы.

Для вычисления размера (в мегабайтах) всех индексов, используйте следующие операторы:

Индексы InnoDB
SELECT CEIL( SUM( index_length + data_length ) / POWER( 1024, 2 ) ) innodb_buffer_pool_size_MB FROM information_schema.tables WHERE engine = 'InnoDB';

Индексы MyISAM
SELECT CEIL( SUM( index_length ) / POWER( 1024, 2 ) ) key_buffer_size_MB FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ( 'information_schema', 'performance_schema', 'mysql' );

Загрузка наиболее важных индексов в RAM
Для получения максимально возможной производительности, необходимо уменьшить до минимума обращение к жёсткому диску. Для этого необходимо иметь достаточное количество RAM для хранения индексов таблиц mshop_catalog_index_* в кеше MySQL.

Для таблиц InnoDB, оператор OPTIMIZE TABLE гарантирует, что полные индексы (и данные, так как InnoDB хранит их в одной структуре данных) таблиц находятся в кеше, если его размер достаточен:

OPTIMIZE TABLE mshop_catalog_index_attribute OPTIMIZE TABLE mshop_catalog_index_catalog OPTIMIZE TABLE mshop_catalog_index_price

Другой оператор требуется для таблицы MyISAM для текстов, содержащих полнотекстовый индекс:

LOAD INDEX INTO CACHE mshop_catalog_index_text

Если на сервере баз данных достаточно много RAM, можно также загрузить в неё таблицы mshop_product и mshop_product_list:

OPTIMIZE TABLE mshop_product OPTIMIZE TABLE mshop_product_list