MySQL и основы производительности

Тема в разделе "Администрирование серверов", создана пользователем nix, 15 мар 2013.

  1. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    890
    Сразу после установки MySQL, прилагаеться несколько готовых конфигурационных файлов для разных задач и разных серверов. К сожалению, многие этого не знают и работают с настройками по умолчанию. Что очень часто становится причиной постоянных "зависаний сайтов"(плохой роботы скриптов) и выхода из строя самого сервера.
    Вот и они - готовые конфигурации

    В каталоге /usr/share/doc/mysql-server-x.x.xx/ лежат следующие файлы(где x.x.xx - версия MySQL):

    my-small.cnf — для систем с малым обьемом памяти (<=64Mb), в которых MySQL используется редко.
    my-medium.cnf — если памяти мало (32-64Mb) или MySQL используется совместно с другими приложениями (например Apache) и памяти около 128Mb.
    my-large.cnf, my-huge.cnf — для систем с большим обьемом памяти (512Mb, 1-2Gb), где MySQL играет главную роль.
    my-innodb-heavy-4G.cnf — 4Gb памяти, InnoDB, MySQL играет главную роль.

    Если у Вас на сервере небольшое кол-во сайтов и небольшая нагрузка на БД, то можно обойтись файлом конфигурации my-medium.cnf. Перенесите параметры из секции [mysqld] этого файла в /etc/my.cnf:

    В случае, если на Вашем сервере работают сайты с большой нагрузкой на БД (интернет-магазины, крупные форумы ...) и большим количеством посещений то рекомендую воспользоваться файлом конфигурации my-huge.cnf

    Или самостоятельно изучить все параметры и настроить сервер под свои нужды [Рекомендую]

    Рассмотрим наиболее важные параметры конфигурации для понимания:

    thread_cache — создание/уничтожение потоков также является ресурсоёмкой операцией, которая происходит при каждой установке соединения и каждом разрыве соединения. Я обычно выставляю эту опцию равную 16. Если у Вашего приложения могут быть скачки количество конкурентных соединений и по переменной Threads_Created виден быстрый рост количества потоков, то стоит увеличить значение thread_cache. Цель — не допускать создания новых потоков в условиях нормального функционирования сервера.

    thread_cache_size — указывает число кэшируемых потоков. После обработки запроса сервер не будет завершать поток, а разместит его в кэше, если число потоков, находящих в кэше меньше, чем указанное значение. Значение по умолчанию 0, увеличьте его до 8 или сразу до 16. Если наблюдается рост значения переменной состояния Threads_Created, то следует еще увеличить thread_cache_size.

    max_allowed_packet — максимальный размер данных, которые могут быть переданы за один запрос. Следует увеличить, если столкнетесь с ошибкой «Packet too large».

    max_connections — максимальное количество параллельных соединений к серверу. Увеличьте его, если сталкиваетесь с проблемой «Too many connections».

    low-priority-updates — эта опция снижает приоритет операций INSERT/UPDATE по сравнению с SELECT. Актуально, если данные важно быстрее прочитать, чем быстрее записать.

    max_join_size — запрещает SELECT операторы, которые предположительно будут анализировать более указанного числа строк или больше указанного числа поисков по диску. Используется для защиты от кривых запросов, которые пытаются считать миллионы строк. Значение по умолчанию более 4 миллиардов, поэтому вы скорее всего захотите его значительно уменьшить.

    max_sort_length — указывает, сколько байт из начала полей типа BLOB или TEXT использовать при сортировке. Значение по умолчанию 1024, если вы опасаетесь некорректно спроектированных таблиц или запросов, то следует его уменьшить.

    [САМОЕ "интересное"] Кэширование запросов

    query_cache_limit — максимальный размер кэшируемого запроса.

    query_cache_min_res_unit — минимальный размер хранимого в кэше блока.

    query_cache_size — размер кэша. 0 отключает использование кэша. Для выбора оптимального значения необходимо наблюдать за переменной состояния Qcache_lowmem_prunes и добиться, чтобы ее значение увеличивалось незначительно. Также нужно помнить, что излишне большой кэш будет создавать ненужную нагрузку. Если Ваше приложение много и часто читает данные, и при этом у Вас нет кэша на уровне приложения, эта опция может очень помочь. Не ставьте здесь слишком большое значение, так как обслуживание большого кэша запросов будет само по себе затратным. Рекомендуемое значение — от 32 до 512 МБ. Не забудьте проверить, насколько хорошо используется кэш запросов — в некоторых условиях (при небольшом количестве хитов в кэше, т.е. когда практически не выбираются одинаковые данные) использование большого кэша может ухудшить производительность.

    query_cache_type — (OFF, DEMAND, ON). OFF отключает кэширование, DEMAND – кэширование будет производиться только при наличии директивы SQL_CACHE в запросе, ON включает кэширование.

    query_cache_wlock_invalidate — определяет будут ли данные браться из кеша, если таблица, к которым они относятся, заблокирована на чтение.
    _____________________________________________________________________________________________
    Кэш запросов можно представить себе как хэш-массив, ключами которого являются запросы, а значениями — результаты запросов. Кроме результатов, MySQL хранит в кэше список таблиц, выборка из которых закэширована. Если в любой из таблиц, выборка из которой есть в кэше, проиcходят изменения, то MySQL удаляет из кэша такие выборки. Также MySQL не кеширует запросы, результаты которых могут измениться.
    При запуске MySQL выделяет блок памяти размером в query_cache_size. При выполнении запроса, как только получены первые строки результата сервер начинает кэшировать их: он выделяет в кэше блок памяти, равный query_cache_min_res_unit, записывает в него результат выборки. Если не вся выборка поместилась в блок, то сервер выделяет следующий блок и так далее. В момент начала записи MySQL не знает о размере получившейся выборки, поэтому если записанный в кэш размер выборки больше, чем query_cache_limit, то запись прекращается и занятое место освобождается, следовательно, если вы знаете наперед, что результат выборки будет большим, стоит выполнять его с директивой SQL_NO_CACHE.
    _____________________________________________________________________________________________

    log_slow_queries — указывает серверу логировать долгие («медленные») запросы (выполняющиеся дольше long_query_time). В качестве значения передается полное имя файла (например /var/log/slow_queries).

    long_query_time — если запрос выполняется дольше указанного времени (в секундах), то он будет считаться «медленным».

    net_read_timeout — время в секундах, в течение которого сервер будет ожидать получения данных, прежде чем соединение будет прервано. Если сервер не обслуживает клиентов с очень медленными или нестабильными каналами, то 15 секунд здесь будет достаточно.

    net_write_timeout — время в секундах, в течение которого сервер будет ожидать получения данных, прежде чем соединение будет прервано. Если сервер не обслуживает клиентов с очень медленными или нестабильными каналами, то 15 секунд здесь будет достаточно.

    wait_timeout — время в секундах, в течение которого сервер ожидает активности соединения, прежде чем прервет его. В общем случае 30 секунд будет достаточно.

    [И еще немножко важного] Буферы
    _____________________________________________________________________________________________
    У всех буферов есть общая черта — если из-за установки большого размера буфера данные будут уходить в файл подкачки, то от буфера будет больше вреда, чем пользы. Поэтому всегда ориентируйтесь на доступный вам объем физической ОЗУ.
    _____________________________________________________________________________________________

    key_buffer_size — размер буфера, выделяемого под индексы и доступного всем потокам. Весьма важная настройка, влияющая на производительность. Значение по умолчанию 8 МБ, его однозначно стоит увеличить. Крайне важная настройка при использовании MyISAM-таблиц. Установите её равной около 30-40% от доступной оперативной памяти, если используете только MyISAM. Правильный размер зависит от размеров индексов, данных и нагрузки на сервер — помните, что MyISAM использует кэш операционной системы (ОС), чтобы хранить данные, поэтому нужно оставить достаточно места в ОЗУ под данные, и данные могут занимать значительно больше места, чем индексы. Однако обязательно проверьте, чтобы всё место, отводимое директивой key_buffer_size под кэш, постоянно использовалось — нередко можно видеть ситуации, когда под кэш индексов отведено 4 ГБ, хотя общий размер всех .MYI-файлов не превышает 1 ГБ. Делать так совершенно бесполезно, Вы только потратите ресурсы. Если у Вас практически нет MyISAM-таблиц, то key_buffer_size следует выставить около 16-32 МБ — они будут использоваться для хранения в памяти индексов временных таблиц, создаваемых на диске.

    max_heap_table_size — максимальный допустимый размер таблицы, хранящейся в памяти (типа MEMORY). Значение по умолчанию 16 МБ, если вы не используете MEMORY таблиц, то установите это значение равным tmp_table_size.

    myisam_sort_buffer_size — размер буфера, выделяемого MyISAM для сортировки индексов при REPAIR TABLE или для создания индексов при CREATE INDEX, ALTER TABLE. Значение по умолчанию 8 МБ, его стоит увеличить вплоть до 30-40% ОЗУ. Выигрыш в производительности соответственно будет только при выполнении вышеупомянутых запросов.

    net_buffer_length — объем памяти, выделяемый для буфера соединения и для буфера результатов на каждый поток. Буфер соединения будет указанного размера и буфер результатов будет такого же размера, т.е. на каждый поток будет выделен двойной размер net_buffer_length. Указанное значение является начальным и при необходимости буферы будут увеличиваться вплоть до max_allowed_packet. Размер по умолчанию 16 КБ. В случае ограниченной памяти или использования только небольших запросов значение можно уменьшить. В случае же постоянного использования больших запросов и достаточного объема памяти, значение стоит увеличить до предполагаемого среднего размера запроса.

    read_buffer_size — каждый поток при последовательном сканировании таблиц выделяет указанный объем памяти для каждой таблицы. Как показывают тесты, это значение не следует особо увеличивать. Размер по умолчанию 128 КБ, попробуйте увеличить его до 256 КБ, а затем до 512 КБ и понаблюдайте за скоростью выполнения запросов типа SELECT COUNT(*) FROM table WHERE expr LIKE "a%"; на больших таблицах.

    read_rnd_buffer_size — актуально для запросов с "ORDER BY", т.е. для запросов, результат которых должен быть отсортирован и которые обращаются к таблице, имеющей индексы. Значение по умолчанию 256 КБ, увеличьте его до 1 МБ или выше, если позволяет память. Учтите, что указанное значение памяти также выделяется на каждый поток.

    sort_buffer_size — каждый поток, производящий операции сортировки (ORDER BY) или группировки (GROUP BY), выделяет буфер указанного размера. Значение по умолчанию 2 МБ, если вы используете указанные типы запросов и если позволяет память, то значение стоит увеличить. Большое значение переменной состояния Sort_merge_passes указывает на необходимость увеличения sort_buffer_size. Также стоит проверить скорость выполнения запросов вида SELECT * FROM table ORDER BY name DESC на больших таблицах, возможно увеличение буфера лишь замедлит работу (в некоторых тестах это так).

    table_cache (table_open_cache с версии 5.1.3) — количество кэшированных открытых таблиц для всех потоков. Открытие файла таблицы может быть достаточно ресурсоемкой операцией, поэтому лучше держать открытые таблицы в кэше. Следует учесть, что каждая запись в этом кэше использует системный дескриптор, поэтому возможно придется увеличивать ограничения на количество дескрипторов (ulimit). Значение по умолчанию 64, его лучше всего увеличить до общего количества таблиц, если их количество в допустимых рамках. Переменная состояния Opened_tables позволяет отслеживать число таблиц, открытых в обход кэша, желательно, чтобы ее значение было как можно ниже.
    Если у Вас несколько сотен таблиц, то стартовым значением для опции table_cache может быть«1024» (помните, что каждое соединение требует свой собственный дескриптор). Если у Вас ещё больше таблиц или очень много соединений — увеличьте значение параметра.

    tmp_table_size — максимальный размер памяти, выделяемой для временных таблиц, создаваемых MySQL для своих внутренних нужд. Это значение также ограничивается переменной max_heap_table_size, поэтому в итоге будет выбрано минимальное значение из max_heap_table_size и tmp_table_size, а остальные временные таблицы будут создаваться на диске. Значение по умолчанию зависит от системы, попробуйте установить его равным 32 МБ и понаблюдать за переменной состояния Created_tmp_disk_tables, ее значение должно быть как можно меньше.
    _____________________________________________________________________________________________

    thread_concurrency - Если у вас много памяти и много таблиц, то для увеличения производительности, при запуске сервера рекомендуется использовать следующие формулы, учитывающие специфику работы mysql под различные ОС:
    • Для FreeBSD: thread_concurrency = (кол-во процессоров)*(кол-во ядер в одном процессоре)
    • Для Linux: thread_concurrency = (кол-во процессоров)*(кол-во ядер в одном процессоре)*3
    thread_stack - Размер стека для каждого потока. Обычно значение по умолчанию является достаточным.
    _____________________________________________________________________________________________

    Если вы не используете таблицы типа InnoDB и BDB, лучше отключить эти хранилища данных. Так вы сэкономите немного памяти. Это особенно важно, если вы владелец VPS.
    Добавьте в секцию [mysqld] строки:
    Код:
    skip-innodb
    skip-bdb
    _____________________________________________________________________________________________
    Зная влияния приведенных настроек невозможно настроить сервер не зная и не понимая насколько он загружен.
    _____________________________________________________________________________________________

    Для тонкой и ефективной настройки вашего любимца рекомендую пользоваться утилитой MySQL Performance Tuning — для оптимальной настройки MySQL конфига.
    Эта утилита показывает рекомендованные значения настройки на основе логов (загруженности) сервера за последние 48 часов.
    www.transcendlinux.com/mysql-performance-tuning
    wiki.mysqltuner.com/MySQLTuner
     
    Globe-Star, halfhope, saxum2010 и 2 другим нравится это.
  2. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    18
    Симпатии:
    1
    в файле настройки mySql
    раширение .cnf
     
  3. Максим прапрар

    Максим прапрар

    Регистрация:
    27 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    а где эти файлы настроек лежат?не могу найти
     
  4. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    890
    Для особо одаренных цитирую с добавлением:
    Иногда файлы настроек в каталоге /usr/share/doc/mysql-server-x.x.xx/ бывают заархивированы(точнее имеют формат архива) gz или другой, но все равно называются как my-small.cnf.gz и т.д.... и т.п...
    И только один файл может иметь формат файла cnf, почему один и почему например my-medium.cnf, потому что при установке сервера MySQL система выбрала етот файл и предварительно подготовила его для себя...
    Не ничего страшного если мы откроем файл my-small.cnf.gz любым редактором например VIM NANO и посмотрим что ето текстовый файл с настройками...

    Файл настройки в разных ОСях имеет свое место, например в CentOS ето /etc/my.cnf в Debian, Ubuntu - /etc/mysql/my.cnf
     
    Globe-Star нравится это.
  5. Максим прапрар

    Максим прапрар

    Регистрация:
    27 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    Вот именно этот каталог я не могу найти
     
  6. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    18
    Симпатии:
    1
    вбейте НА СЕРВЕРЕ где стаит mysql, в поиск название файла *.cnf
    и сразу все найдете
     
  7. Smile-Smile

    Smile-Smile

    Регистрация:
    19 мар 2013
    Сообщения:
    37
    Симпатии:
    1
    my.cnf могу найти.. а вот остальные конфигурации не могу найти(((( нет в папке /usr/share/doc/ ничего даже отдаленно похожего на mysql и вообще больше не нашла ни одного файла с расширением cnf/
    Всего под 200 товаров, а время загрузки 1,2 ужас просто((((
     
  8. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    какой дистрибутив линукса стоит?
     
  9. Smile-Smile

    Smile-Smile

    Регистрация:
    19 мар 2013
    Сообщения:
    37
    Симпатии:
    1
    Хостер nic.ru
    • Apache/1.3.37 (Unix) mod_ssl/2.8.28 OpenSSL/0.9.7e-p1 PHP/5.2.10
    • Версия MySQL-клиента: 5.1.16-beta
      • Версия сервера: 5.1.73-log
    • PHP расширение: mysql
    --- Добавлено, 31 мар 2014 ---
    Вот что нашла:
    Только теперь я еще больше запуталась... и совсем не знаю, что и куда и как настраивать....
     
    Последнее редактирование: 31 мар 2014