Эта заметка, в основном, является переводом соответствующих разделов руководства по MySQL.
Здесь собраны возможные способы настройки и использования MySQL-сервера для достижения максимальной производительности. Все нижесказанное относится к версии 3.22 для Linux. Для других операционных систем некоторые из утверждений могут не выполняться.

Компилирование исходников.

Для достижения наибольшей производительности сервера нужно учитывать такие факты:

  1. При компиляции pgcc с опцией -O6 mysqld работает на 11 % быстрее, чем если компилировать обычным gcc.
  2. Если использовать динамическую линковку, то результат будет на 13% медленней, чем при статической.
  3. Если использовать TCP/IP соединения, то результат на 7.5% хуже, чем при использовании UNIX - сокетов.

В связи с этим рекомендуется поставить компилятор pgcc (http://www.goof.com/pcg/). Этот совет, конечно, имеет смысл, если у вас Pentium процессор. Pgcc будет полезен не только для компилирования MySQL, разработчики этого компилятора утверждают, что откомпилированные им программы минимум на 5% работают быстрее, чем откомпилированные с помощью gcc.

Запуск конфигуратора может иметь такой вид (во внимание вышеизложенные факты):

CFLAGS="-O6 -fomit-frame-pointer" \ CXX=gcc \ CXXFLAGS="-O6 -fomit-frame-pointer \ -felide-constructors -fno-exceptions -fno-rtti" \ ./configure \ --enable-assembler \ --disable-shared \ --with-mysqld-ldflags="-all-static" \ --with-client-ldflags="-all-static" \ --with-unix-socket-path=/tmp/mysql.sock \ --prefix=/usr

Настройка переменных.

Если запустить mysqladmin -variables, то можно увидеть примерно такую картину.

Variable_name Value
back_log 5
connect_timeout 5
basedir /usr/local/
datadir /home/www/data/
delayed_insert_limit 100
delayed_insert_timeout 300
delayed_queue_size 1000
join_buffer 131072
flush_time 0
key_buffer 8388600
language /usr/local/share/mysql/english/
log OFF
log_update OFF
long_query_time 10
low_priority_updates OFF
max_allowed_packet 1048576
max_connections 100
max_connect_errors 10
max_delayed_insert_threads 20
max_join_size 4294967295
max_sort_length 1024
net_buffer_length 16384
pid_file /usr/local/var/mysqld.pid
port 3306
protocol_version 10
record_buffer 131072
skip_locking ON
skip_networking OFF
socket /tmp/mysql.sock
sort_buffer 2097144
table_cache 64
thread_stack 65536
tmp_table_size 1048576
tmpdir /tmp/
version 3.22.27
wait_timeout 28800

От настройки этих переменных сильно зависит производительность сервера. Надо сказать, что не существует наилучших значений для всех случаев. Для каждого конкретного сервера и поставленных задач нужно выбирать свои значения.

Рассмотрим подробнее эти переменные (......выделены наиболее важные из них).

back_log - этот параметр показывает, сколько одновременно может быть невыполненных запросов на соединение (connection requests). Параметр имеет большое значение в тех случаях, когда к MySQL поступает ОЧЕНЬ много запросов на соединение в малый промежуток времени.

Когда к MySQL поступает connect-запрос, производятся следующие действия - проверяется, разрешен ли доступ к серверу, и если разрешен, то порождается новый процесс. Все это занимает достаточно мало времени. Однако если за это время поступит еще один connect-запрос, то он заносится в очередь. Параметр back_log определяет длину этой очереди. Если количество запросов превысит данное значение, то все непомещающиеся запросы будут игнорироваться. По умолчанию значение back_log равно 5, что вполне достаточно для большинства серверов.

Максимально значение back_log ограничено операционной системой.

connect_timeout - количество секунд, которое сервер ждет connect-пакета, по истечении этого времени будет выдан пакет " соединение ". Для более детальных разъяснений см. описание TCP/IP протокола.

delayed_insert_timeout - как долго поток INSERT DELAYED будет ожидать данных для INSERT. Более подробно значение слова DELAYED расписано в описании INSERT запроса.

delayed_insert_limit - INSERT DELAYED вставив количество записей, равное delayed_insert_limit, проверяет, есть ли SELECT-запрос к этой же таблице. Если есть, то выполняется SELECT, и только после этого продолжается INSERT.

delayed_queue_size - Для выполнения INSERT DELAYED будет выделятся очередь длиной в delayed_queue_size строк. Когда очередь заполниться все остальные конкурирующие INSERT DELAYED запросы будут ждать, пока не освободиться место в этой очереди.

flush_time - Если значение больше нуля, то каждые flush_time секунд все таблицы будут закрываться. Это позволит освобождать неиспользуемые ресурсы и синхронизировать данные на диске.

join_buffer - Величина буфера, который используется для полных JOIN запросов (.. для полного объединения двух таблиц без использования индексов). Память под такой буфер выделяется один раз для каждого запроса. Увеличение параметра ускорит выполнение таких запросов. Более естественный путь ускорить полные JOIN запросы - использовать индексы.

key_buffer - Величина буфера (байтах), который используется для индексов. Этот буфер общий для всех потоков. Если используется много DELETE или INSERT запросов к таблицам с большим кол - индексов, то увеличение значения повысит скорость выполнения таких запросов. Для достижения еще большей скорости нужно использовать LOCK TABLES.

long_query_time - Если время выполнения запроса превысит данное значение (сек.), то внутренний счетчик slow_queries будет увеличен на 1. Посмотреть значение счетчика можно командой mysql>status.

max_allowed_packet - Максимальный размер пакета для передачи данных. Данные между клиентом и сервером передаются пакетами. В начале создается пакет длиной net_buffer_length затем, если размер данных больше, то размер пакета увеличивается до необходимого значения, при этом его длина не может превысить значение max_allowed_packet. Если используются поля BLOB большого размера, то рекомендуется увеличить значение этого параметра. В идеале нужно присвоить этой переменной значение размера самого большого BLOB поля.

max_connections - Максимальное количество открытых соединений. Определяет, сколько клиентов одновременно могут работать с сервером. Увеличение параметра увеличивает количество используемых дескрипторов файла.

max_connect_errors - Если в процессе общения с клиентом произошел обрыв соединения (interrupt connection), то счетчик ошибок для хоста клиента увеличивается на 1. Когда значение этого счетчика достигнет max_connect_errors, то все последующие соединения с данного хоста будут игнорироваться. Для обнуления счетчиков использовать команду FLUSH HOSTS.

max_delayed_threads - Максимальное количество потоков, которые выполняют INSERT DELAYED. Если будет вызван запрос INSERT DELAYED, а при этом достигнуто значение max_delayed_threads, то такой запрос будет выполнен как обычный INSERT (опции DELAYED).

max_join_size - Максимальное количество записей, которое может быть возвращено полным JOIN запросом. Если в JOIN запросе кол - записей превысит это значение, то будет возвращена ошибка. Увеличение значения этого параметра позволит выполнять большие запросы, но при этом следует учитывать, то такие запросы съедают много процессорного времени и могут содержать миллионы записей.

max_sort_length - При сортировке BLOB или TEXT полей из каждого поля берутся только первые max_sort_length байт, а остальные отбрасываются и при сортировке не учитываются.

max_tmp_tables - Максимальное количество временных таблиц, которые клиент может сохранять открытыми одновременно. На самом деле в версии 3.22 это поле ни на что не влияет.

net_buffer_length - Размер пакета для передачи данных (. max_allowed_packet) Обычно этот параметр не нужно изменять, но если у вас очень мало памяти, то его можно уменьшить до ожидаемого размера результата запроса.

record_buffer - Каждый поток, который осуществляет последовательное сканирование таблиц (это происходит в SELECT запросах), для каждой таблицы, участвующей в сканировании выделяет память размером record_buffer. Если будет много запросов, требующих последовательно сканировать таблицы, то значение этого параметра рекомендуется увеличить.

sort_buffer - Каждый поток, который осуществляет сортировку данных (ORDER BY или GROUP BY), выделяет память размером sort_buffer. Для повышения быстродействия запросов с ORDER BY или GROUP BY это значение необходимо увеличить.

table_cache - Количество открытых таблиц для ВСЕХ потоков. Увеличение значения приведет к увеличению количества используемых дескрипторов файла. MySQL необходимо 2 дескриптора для каждой открытой таблицы.

tmp_table_size - Максимальный размер временных таблиц. При превышении этого размера возвращается ошибка table tbl_name is full. При использовании сложных GROUP BY запросов значение нужно увеличить.

thread_stack - Размер стека для каждого потока. Обычно значение по умолчанию является достаточным.

wait_timeout - Время, которое поток ждет повторного обращения. Если за это время к потоку не было ни одного обращения, то поток убивается.

Параметры table_cache, max_connections и max_tmp_tables определяют, как много файлов сервер будет держать открытыми. Максимально количество открытых файлов для каждого процесса ограничивается операционной системой. На многих ОП это количество можно увеличить. Для более детальной информации см. руководство по вашей ОП.

table_cache зависит от max_connections. Например, если у вас 200 открытых соединений, то вам может понадобиться до 200*n открытых таблиц, где n - количество таблиц, участвующих в запросах.

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

Изменить значение настроек можно при запуске сервера опцией -O, например,

>safe_mysqld -O key_buffer=1 6M (значениях, которые измеряются в байтах, для сокращения, можно использовать буквы К и М).

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

>safe_mysqld -O key_buffer=16M -O table_cache=128 \ -O sort_buffer=4M -O record_buffer=1M &

Если у вас мало памяти и ожидается мало соединений, то лучше сервер запускать с такими опциями

>safe_mysqld -O key_buffer=512k -O sort_buffer=100k \ -O record_buffer=100k &

> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \ -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &

Необходимо принимать во внимание, что, если сервер сконфигурировать для использования малого объема памяти, то в случае большого числа соединений может возникнуть " своппинга ", которая сильно затормозит сервер.

Как MySQL работает с памятью.

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

  1. Key_buffer является общим для всех потоков. Все остальные буфера выделяются по мере необходимости.
  2. Каждое соединение использует некоторое количество памяти. Это память для стека (thread_stack), буфер соединения (net_buffer_length) и буфер результата (net_buffer_length)
  3. Для каждого запроса, требующего последовательно сканировать таблицу, выделяется буфер чтения (record_buffer).
  4. Все JOIN запросы выполняются в один проход и для большинства таких запросов нет необходимости применять вспомогательные таблицы. В основном вспомогательные таблицы формируются в памяти, но если такая таблица имеет слишком большой размер записи или используется тип BLOB, то она сохраняется на диске. Если размер вспомогательной таблицы, которая хранится в памяти, превысит tmp_table_size, то будет возвращена ошибка table_name is full. Для избежания такой ошибки нужно или увеличить значение tmp_table_size, или включить опцию SQL_BIG_TABLES (можно сделать либо запросом SET SQL_BIG_TABLES=1, либо запускать mysqld с опцией -big-tables). При включенной опции SQL_BIG_TABLES все вспомогательные таблицы формируются не в памяти, а на диске.
  5. Запросы с сортировкой выделяют в памяти буфер для сортировки (sort_buffer ) и используют один или два временных файла.
  6. Таблицы с данными открываются каждым конкурирующим потоком. Индексные файлы открываются всего один раз, не зависимо от количества потоков, использующих эти файлы.
  7. Для таблиц с BLOB-полями буфер автоматически увеличивается до размера самого большого BLOB-поля.
  8. Дескрипторы всех открытых таблиц хранятся в кэше, который работает по принципу FIFO. Размер кэша определяется переменной table_cache . Если несколько потоков открывают одну и туже таблицу, то для каждого потока выделяется свой дескриптор таблицы.
  9. Команда mysqladmin flash-tables закрывает все таблицы, которые не используются в данный момент, а все используемые таблицы помечает для закрытия. Такая операция позволяет освободить неиспользуемую память.

Как работать с таблицами для достижения большей производительности.

  1. По возможности все поля декларировать как NOT NULL. Это сделает работу с таблицами более быстрой и сохранит 1 бит на каждое такое поле.
  2. Применять значения по умолчанию (DEFAULT). При вызове запроса INSERT в таблицу будут записываться только те поля, значения которых отличаются от DEFAULT.
  3. Используйте настолько малые типы INT, насколько это возможно. Например, применять MEDIUMINT намного лучше, чем обычный INT.
  4. Если у вас нет записей с переменной длиной (ни одного поля с типом VARCHAR, BLOB или TEXT), то таблица сохраняется в формате " постоянной длиной записи ". Это несколько расходует память, но намного повышает скорость работы.
  5. При использовании нескольких последовательных INSERT запросов, лучше все данные указать в одном INSERT, чем делать несколько INSERT.
  6. При загрузке данных в таблицу лучше использовать LOAD DATA INFILE, чем INSERT, такой метод в 20 раз быстрее.
  7. Для увеличения скорости LOAD DATA INFILE и INSERT нужно увеличить значение переменной key_buffer.
  8. Если ожидается много запросов INSERT или UPDATE, работающих одновременно, то для большей скорости рекомендуется приметь LOCK TABLES.
  9. Время от времени нужно дефрагметировать таблицы. Это делается утилитой isamchk с опциями - evi.

Форматы таблиц в MySQL

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

Таблицы с фиксированной длиной строки.

    Этот формат применяется по умолчанию, если в таблице нет полей с типом VARCHAR,
    BLOB или TEXT.
    Все поля типа CHAR, NUMERIC и DECIMAL дополняются в конце пробелами.
    Высокая скорость работы.
    Легко кэшируются.
    Легко восстановить после краха, так как все строки имеют постоянную длину.
    Не требуют реорганизации (помощью isamchk), до тех пор, пока не будет удалено очень много записей, и вы захотите освободить место на диске.
    Обычно такие таблицы занимают больше места, чем таблицы с динамической длиной строки.

Таблицы с динамической длиной строки.

    Этот формат применяется, если в таблице есть поля с типом VARCHAR, BLOB или TEXT.
    Все строки динамические (CHAR хранятся как VARCHAR, кроме тех у которых длина меньше 4).
    Каждое поле имеет дополнительный бит, который устанавливается, если строковое поле равно "" (строка), или если числовое поле равно 0 (не то же самое, когда поле может иметь значение NULL).
    Непустые строки хранятся в виде {_} {_}
    Обычно такие таблицы занимают намного меньше места, чем таблицы с фиксированной длиной.
    Ожидаемая длина строки вычисляется по формуле: 3+(количество полей + 7)/8+(количество полей типа CHAR)+(размер числовых типов в бинарном виде)+(длина всех строк)+(количество NULL-полей + 7)/8.

Сжатые таблицы.

    Таблицы "только для чтения", их можно получить с помощью утилиты pack_isam. Эту утилиту получают все покупатели, которые приобрели расширенную поддержку MySQL.
    Основная характеристика - занимают мало места.

Использование индексов.

Все индексы (PRIMARY, UNIQUE и INDEX) хранятся в B-дереве. В строковых типах автоматически происходит сжатие начальных и конечных пробелов.

Индексы используются для:

    Быстрого поиска записей по условию WHERE;
    Для объединения таблиц с посредством JOIN;
    Поиска MAX() и MIN() значений для ключевых полей;
    Для сортировки и группировки таблиц (......ORDER BY и GROUP BY);
    Для извлечения данных не из таблицы с данными, а из индексного файла. Это возможно только в некоторых случаях, например, когда все извлекаемые поля проиндексированы.

Рассмотрим следующий запрос SELECT:

SELECT * FROM tbl_name WHERE col =val AND col2=val2;

Если таблица имеет множественный индекс (col,col2), то соответствующие записи будут выбраны напрямую. Если существуют только одиночные индексы для col и col2, то оптимизатор сначала решит, при использовании какого индекса, количество возвращаемых записей будет меньше, а затем из этих записей будет произведена выборка по другому условию.

Если таблица имеет множественный индекс, то любой " префикс " этого индекса может использоваться для оптимизации запроса. Например, если есть индекс (col, col2, col3), то можно считать, что существуют индексы (col); (col,col2); (col,col2,col3).

Любая другая часть индекса не может быть использована для оптимизации. Рассмотрим для примера такие запросы:

mysql> SELECT * FROM tbl_name WHERE col =val ; mysql> SELECT * FROM tbl_name WHERE col2=val2; mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

Если есть индекс (col,col2,col3), то только в первом запросе будет использоваться индекс. Хотя второй и третий запросы содержат столбцы, которые присутствуют в индексе, но (col2) и (col2,col3) не являются левыми частями множественного индекса, и поэтому при выполнении этих запросов индекс применятся не будет.

MySQL также использует индексы для LIKE операций, если аргумент LIKE является строковой константой и при этом не начинается с символа шаблона (% или _). Например, следующие SELECT запросы используют индекс для key_col:

mysql> select * from tbl_name where key_col LIKE "Patrick%"; mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";

А следующие два запроса выполняются без использования индекса:

mysql> select * from tbl_name where key_col LIKE "%Patrick%"; mysql> select * from tbl_name where key_col LIKE other_col;

В первом из этих запросов аргумент после LIKE начинается c символа шаблона, а во втором аргумент не является константой.

  1. Запускать mysqld с правильно подобранными опциями (. настройка переменных).
  2. Для ускорения SELECT запросов построить индексы для тех полей, которые участвуют в условии WHERE.
  3. Оптимизировать типы полей. По возможности использовать NOT NULL. (. работу с таблицами).
  4. В MySQL применяется два способа блокировки таблиц (lock table) - внутренняя и внешняя блокировки. Внутренняя блокировка позволяет делать операции по изменению / данных атомарными (конфликтующими с другими пользователями). Внешняя блокировка применяется для одновременного доступа нескольких MySQL серверов к одним и тем же базам данных, а также внешняя блокировка позволяет запускать isamchk без остановки MySQL. Чтобы запретить использование внешней блокировки нужно запускать mysqld с опцией -skip-locking. Запрет внешней блокировки существенно повысит скорость работы, но при этом перед запуском isamchk нужно предварительно сбросить все данные на диск командой mysqladmin flush-tables. Также при запрете внешней блокировки нельзя будет использовать несколько серверов для работы с теми же базами данных.
  5. Задание прав доступа на конкретную таблицу или поле снижает производительность.

Установка сервера MySQL из репозитория

Для установки сервера MySQL в Debian достаточно набрать команду:
apt-get install mysql-server

В операционной системе RHEL / CentOS также все довольно просто:
yum install mysql-server

Обратите внимание: после установки сервера MySQL его необходимо запустить. Для этого (как в Debian, так и в RHEL / CentOS) необходимо выполнить команду:
service mysqld start

Установка клиента MySQL из репозитория

Для установки клиента mysql запустите в debian следующую команду:
apt-get install mysql-client

В случае, если у Вас установлен RHEL / CentOS, выполните такую команду:
yum install mysql

При этом будет установлена актуальная (на момент выполнения команды) версия MySQL. На момент написания статьи это версия 5.5.

Установка библиотек MySQL для поддержки компиляции (MySQL development) из репозитория

Если Вы устанавливаете MySQL не по своему желанию, а потому, что это необходимо для установки какой-либо программы (например, asterisk, поддержка cdr_mysql), то просто установить сервер (и/или клиент) MySQL недостаточно. Необходимо также поставить библиотеки MySQL, чтобы компиляция зависящей от MySQL программы была успешной.

Для debian это будет команда:
apt-get install libmysqlclient-dev

Для RHEL / CentOS выполните:
yum install mysql-devel

Первоначальная настройка MySQL

Даже в случае, если Вы устанавливаете MySQL на домашнем/тестовом компьютере (не говоря уже об установке в производственной среде) необходимо совершить хотя бы минимальные действия по настройке MySQL сервера (клиента, как правило, настраивать не нужно). Например, задать пароль пользователя root в системе MySQL. По умолчанию пароль для root - пустой (без пароля).

Задать пароль MySQL root

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

Где rootpass - пароль для пользователя root. Совет : если Вы хотите, чтобы эта команда не отображалась в истории команд (и никто впоследствии не смог бы подсмотреть пароль рута из истории команд), перед этой командой просто поставьте пробел. То есть:
/usr/bin/mysqladmin -u root password "rootpass"

Настройка MySQL для работы в производственной среде

Выполните из командной строки:
/usr/bin/mysql_secure_installation

Данный скрипт (если ответить на задаваемые вопросы yes) - установит новый пароль root (пароль будет запрошен), удалит пользователя anonymous, запретит логинится с удаленных машин под root-ом, удалит тестовую базу.

Создать необходимую базу данных и пользователя для нее

Для создания базы данных в MySQL необходимо сначала подключиться к MySQL, после чего выполнить mysql запрос для создания базы данных. Для этого выполните из командной строки linux:
mysql -u root -p

При этом будет запрошен пароль для пользователя, имя которого указано после опции -u (в данном случае - пароль пользователя root). При правильном введении пароля появится приглашение MySQL к вводу команд:
mysql>_

Это командная строка MySQL. Все SQL запросы и команды на создание баз данных, пользователей и т.д. вводятся в этой командной строке.

Для создания базы данных выполните в командной строке MySQL:
create database имя-базы-данных character set кодировка-базы-данных;

например:
create database asterisk character set utf8;

Кодировку можно не указывать, при этом будет использоваться кодировка по умолчанию (см. настройки сервера MySQL):
create database mydatabase;

Теперь создадим пользователя MySQL и дадим ему полные права на созданную базу данных:
grant all privileges on имя-базы-данных.* to имя-пользователя @localhost identified by " пароль-пользователя ";
например:
grant all privileges on asterisk.* to asterisk_user@localhost identified by "asterisk_password";

добавление в базу данных таблиц из файла

Если у Вас есть таблицы в файлах, которые Вы бы хотели добавить в базу данных, выполните следующую команду:
mysql -u имя-пользователя-mysql -p имя-базы-данных < имя-файла-с-таблицей
например:
mysql -u root -p asterisk < asterisk-cdr.sql
при этом после запуска указанной команды у Вас будет запрошен пароль пользователя MySQL (в данном случае - пароль пользователя root), после чего (если пароль верный!) будет выполнен запрос MySQL, находящийся в файле (в данном случае - в asterisk-cdr.sql).

Возможны также масса дополнительных вариантов/опций/рекомендаций по установке/настройке MySQL, в частности установка кодировки / языка по умолчанию (параметры MySQL хранятся в my.cnf), поиск пользователей с пустыми паролями и замена паролей на непустые, настройка iptables для удаленного подключения к mysql, и так далее. Здесь же были рассмотрены минимально необходимые действия для быстрого начала работы с MySQL.


Прямая ссылка: mysql-5.5.23-win32.msi
Скачайте самораспаковывающийся архив "Windows (x86, 32-bit), MSI Installer" и запустите его.

Установка MySQL в картинках

Далее будут показаны те диалоговые окна, в которых необходимо делать какой-либо выбор.

Нажмите в данном окне выборочную установку компонентов "Custom".

Теперь приступим к настройке MySQL сервера.

Выбираем детализированную настройку - "Detailed Configuration".

Отмечаем пункт "Developer Machine". Мы ведь разработчики – правда? :)

Выбрав пункт "Multifunctional Database", вы сможете работать как с таблицами типа InnoDB (с возможностью использования транзакций), так и с высокоскоростной MyISAM (как правило для веб-разработок используется именно этот тип таблиц).

Выбор диска и директории для хранения таблиц типа InnoDB.

В данном диалоговом окне выбирается максимально возможное количество подключений к серверу MySQL. При выборе "Decision Support (DSS)/OLAP", максимальное количество подключений будет ограничено двадцатью, чего более чем достаточно при установке сервера на домашнем компьютере и отсутствии большого количества одновременных подключений.

Отметив "Enable TCP/IP Networking" мы включаем поддержку TCP/IP соединений и выбираем порт, через который они будут осуществляться. Стандартным для сервера MySQL является порт 3306. Отметив "Enable Strict Mode", мы задаем режим строгого соответствия стандарту SQL (данную опцию рекомендуется оставлять включенной).

Обратите внимание на выставление настроек данного окна. Отметив "Manual Selected Default Character Set / Collation" и выбрав из ниспадающего меню "cp1251" определяем, что изначально для таблиц будет использоваться кодировка Cyrillic Windows (cp1251), что означает корректную работу с русским языком в данной кодировке.

Если отметить "Install As Windows Service", сервер будет запускаться в виде сервиса, что является рекомендуемым способом запуска. Ниже, в ниспадающем списке, задается имя сервиса. Далее, уберите галочку рядом с "Launch the MySQL Server automatically" - мы будем запускать сервер вручную. Также поставьте галочку рядом с "Include Bin Directory in Windows PATH" - это позволит установить видимость директории "bin", для командной строки.

Установите пароль пользователя "root". Советую сделать это. Поставьте хотя бы какой-нибудь простенький пароль, только не оставляйте поле пустым, это убережёт вас от возможных неприятностей в дальнейшем.

В данном окне обратите внимание на строку "Write configuration file", которая указывает на месторасположение - "my.ini", далее, его необходимо будет немного отредактировать.


Откройте для редактирования файл "my.ini".
  1. В раздел , после строки:
    port=3306
    Добавьте строку определяющую каталог содержащий файлы описания кодировок:
    character-sets-dir="C:/Program Files/MySQL/MySQL Server 5.5/share/charsets"
  2. В раздел , после строки:
    port=3306
    Добавьте следующие две строки, первая из которых вам уже известна, вторая – устанавливает кодировку в которой данные передаются MySQL:
    character-sets-dir="C:/Program Files/MySQL/MySQL Server 5.5/share/charsets"
    init-connect="SET NAMES cp1251"
  3. Далее, найдите строку:
    default-storage-engine=INNODB
    Замените изначально устанавливаемый тип таблиц на MYISAM:
    default-storage-engine=MYISAM
Сохраните изменения и закройте файл "my.ini".
Установка и настройка сервера MySQL – завершена.
10 августа 2009 в 15:41

Что нужно настроить в mySQL сразу после установки?

  • MySQL
  • Перевод

Вольный перевод довольно старой статьи с MySQL Performance Blog о том, что лучше сразу же настроить после установки базовой версии mySQL.

Удивительно, сколько народу устанавливает mySQL на свои сервера и оставляют его с настройками по умолчанию.

Несмотря на то, что в mySQL существует довольно много настроек, которые Вы можете изменить, есть набор действительно очень важных характеристик, которые обязательно нужно оптимизировать под собственный сервер. Обычно после такой небольшой настройки производительность сервера заметно увеличивается.

  • key_buffer_size - крайне важная настройка при использовании MyISAM-таблиц. Установите её равной около 30-40% от доступной оперативной памяти, если используете только MyISAM. Правильный размер зависит от размеров индексов, данных и нагрузки на сервер - помните, что MyISAM использует кэш операционной системы (ОС), чтобы хранить данные, поэтому нужно оставить достаточно места в ОЗУ под данные, и данные могут занимать значительно больше места, чем индексы. Однако обязательно проверьте, чтобы всё место, отводимое директивой key_buffer_size под кэш, постоянно использовалось - нередко можно видеть ситуации, когда под кэш индексов отведено 4 ГБ, хотя общий размер всех.MYI-файлов не превышает 1 ГБ. Делать так совершенно бесполезно, Вы только потратите ресурсы. Если у Вас практически нет MyISAM-таблиц, то key_buffer_size следует выставить около 16-32 МБ - они будут использоваться для хранения в памяти индексов временных таблиц, создаваемых на диске.
  • innodb_buffer_pool_size - не менее важная настройка, но уже для InnoDB, обязательно обратите на неё внимание, если собираетесь использовать в основном InnoDB-таблицы, т.к. они значительно более чувствительны к размеру буфера, чем MyISAM-таблицы. MyISAM-таблицы в принципе могут неплохо работать даже с большим количеством данных и при стандартном значении key_buffer_size , однако mySQL может сильно «тормозить» при неверном значении innodb_buffer_pool_size . InnoDB использует свой буфер для хранения и индексов, и данных, поэтому нет необходимости оставлять память под кэш ОС - устанавливайте innodb_buffer_pool_size в 70-80% доступной оперативной памяти (если, конечно, используются только InnoDB-таблицы). Относительно максимального размера данной опции - аналогично key_buffer_size - не стоит увлекаться, нужно найти оптимальный размер, найдите лучшее применение доступной памяти.
  • innodb_additional_mem_pool_size - данная опция практически никак не влияет на производительность mySQL, однако рекомендую оставлять для InnoDB около 20 МБ (или чуть больше) под различные внутренние нужды.
  • innodb_log_file_size - крайне важная настройка в условиях баз данных с частыми операциями записи в таблицы, в особенности при больших объёмах. Бо льшие размеры увеличивают быстродействие, однако будьте осторожны - увеличится и время восстановления данных. Я обычно выставляю значение около 64-512 МБ в зависимости от размера сервера.
  • innodb_log_buffer_size - стандартное значение данной опции вполне подойдёт для большинства систем со средним количеством операций записи и небольшими транзакциями. Если же в Вашей системе бывают всплески активности, или Вы активно работаете с BLOB-данными, то рекомендую немного увеличить значение innodb_log_buffer_size . Однако не переусердствуйте - слишком большое значение будет пустой тратой памяти: буфер сбрасывается каждую секунду, поэтому Вам не понадобится больше места, чем требуется в течение этой секунды. Рекомендуемое значение - около 8-16 МБ, а для небольших баз - и того меньше.
  • - жалуетесь, что InnoDB работает в 100 раз медленнее MyISAM? Вероятно, Вы забыли про настройку innodb_flush_log_at_trx_commit . Значение по умолчанию «1» означает, что каждая UPDATE-транзакция (или аналогичная команда вне транзакции) должна сбрасывать буфер на диск, что достаточно ресурсоёмко. Большинство приложений, в особенности ранее использовавшие таблицы MyISAM, будут хорошо работать со значением «2» (т.е. «не сбрасывать буфер на диск, только в кэш ОС»). Лог, однако, всё равно будет сбрасываться на диск каждые 1-2 секунды, поэтому в случае аварии Вы потеряете максимум 1-2 секунды обновлений. Значение «0» повысит производительность, но Вы рискуете потерять данные даже при аварийной остановке mySQL-сервера, в то время как при установке значение innodb_flush_log_at_trx_commit в «2» Вы потеряете данные только при аварии всей операционной системы.
  • table_cache - открытие таблиц может быть весьма ресурсоёмко. К примеру, MyISAM-таблицы помечают заголовки.MYI файлов как «используемые в текущий момент». Обычно не рекомендуется открывать таблицы слишком часто, поэтому лучше, чтобы кэш был достаточных размеров, чтобы держать все Ваши таблицы открытыми. Для этого используется некоторое количество ресурсов ОС и оперативной памяти, однако это обычно не является существенной проблемой для современных серверов. Если у Вас несколько сотен таблиц, то стартовым значением для опции table_cache может быть«1024» (помните, что каждое соединение требует свой собственный дескриптор). Если у Вас ещё больше таблиц или очень много соединений - увеличьте значение параметра. Я видел mySQL сервера со значением table_cache равной 100 000.
  • thread_cache - создание/уничтожение потоков также является ресурсоёмкой операцией, которая происходит при каждой установке соединения и каждом разрыве соединения. Я обычно выставляю эту опцию равную 16. Если у Вашего приложения могут быть скачки количество конкурентных соединений и по переменной Threads_Created виден быстрый рост количества потоков, то стоит увеличить значение thread_cache . Цель - не допускать создания новых потоков в условиях нормального функционирования сервера.
  • query_cache_size - если Ваше приложение много и часто читает данные, и при этом у Вас нет кэша на уровне приложения, эта опция может очень помочь. Не ставьте здесь слишком большое значение, так как обслуживание большого кэша запросов будет само по себе затратным. Рекомендуемое значение - от 32 до 512 МБ. Не забудьте проверить, насколько хорошо используется кэш запросов - в некоторых условиях (при небольшом количестве хитов в кэше, т.е. когда практически не выбираются одинаковые данные) использование большого кэша может ухудшить производительность.
Как Вы можете видеть, это - глобальные настройки. Эти переменные зависят от «железа» сервера и используемых движков mySQL, в то время как сессионные переменные обычно настраиваются специально под конкретные задачи. Если Вы в основном используете простые запросы, то нет никакой необходимости увеличивать значение sort_buffer_size , даже если у Вас есть лишние 64 ГБ оперативной памяти. Более того, большие значения кэшей могут только ухудшить производительность сервера. Сессионные переменные лучше оставить на потом, для тонкой настройки сервера.

PS: инсталляция mySQL идёт с несколькими предустановленными файлами my.cnf, рассчитанными под разную нагрузку. Если Вам некогда настраивать сервер вручную, то обычно лучше использовать их, чем стандартный конфигурационный файл, выбрав тот, что больше подойдёт под нагрузку Вашего сервера.

Дефолтные конфигурационные параметры в Mysql рассчитаны на микроскопические базы данных, работающие под малыми нагрузками на скромном железе.

Настройка некоторых параметров может повысить производительность базы данных в сотни раз!

Процесс оптимальной настройки Mysql состоит из двух частей — первоначальная настройка и корректировка параметров во время работы. Корректировка параметров в рабочем режиме во многом зависит от специфики Вашей системы и ее мониторинга. Разберемся с параметрами и рекомендациями по установке их значений.

innodb_buffer_pool_size

Если Вы используете только InnoDB таблицы, устанавливайте это значение максимально возможным для Вашей системы. Буфер InnoDB кеширует и данные и индексы. Поэтому значение этого ключа стоит устанавливать в 70%...80% всей доступной памяти.

Innodb_buffer_pool_size = 24G

# При том, что на нашем сервере 32Гб оперативной памяти

innodb_log_file_size

Эта опция влияет на скорость записи. Она устанавливает размер лога операций (так операции сначала записываются в лог, а потом применяются к данным на диске). Чем больше этот лог, тем быстрее будут работать записи (т.к. их поместится больше в файл лога). Файлов всегда два, а их размер одинаковый. Значением параметра задается размер одного файла:

Innodb_log_file_size = 512M

# Так два файла дадут размер лога в 2x512M = 1G

Стоит понимать, что увеличение этого параметра увеличит и время восстановления системы при сбоях. Это происходит потому, что при запуске системы все данные из логов будет накатываться на данные. Однако с каждой новой версией, производительность этого процесса растет. Подумайте над использованием реплик для обеспечения доступности, чтобы не зависеть от времени восстановления базы данных.

innodb_log_buffer_size

Это размер буфера транзакций, которые не были еще закомичены. Значение этого параметра стоит менять в случаях, если вы используете большие поля вроде BLOB или TEXT.

Innodb_log_buffer_size = 2M

# Значения по умолчанию в 1М должно быть достаточно для большинства случаев

innodb_file_per_table

Если включить эту опцию, Innodb будет сохранять данные всех таблиц в отдельных файлах (вместо одного файла по умолчанию). Прироста в производительности не будет, однако есть ряд преимуществ:

  • При удалении таблиц, диск будет освобождаться. По умолчанию общий файл данных может только расширяться, но не уменьшаться.
  • Использование компрессионного формата таблиц потребует включить этот параметр.
innodb_file_per_table = ON

# С версии 5.6 этот параметр включен по умолчанию

innodb_flush_method

Этот параметр определяет логику сброса данных на диск. В современных системах при использовании RAID и резервных узов, вы будете выбирать между O_DSYNC и O_DIRECT :

Innodb_flush_method = O_DSYNC

# Помните об обязательном использовании резервных узлов (например, реплик)

innodb_flush_log_at_trx_commit

Изменение этого параметра может повысить пропускную способность записи данных в базу в сотни раз. Он определяет, будет ли Mysql сбрасывать каждую операцию на диск (в файл лога).

Тут следует руководствоваться такой логикой:

  • innodb_flush_log_at_trx_commit = 1 для случаев, когда сохранность данных — это приоритет номер один.
  • innodb_flush_log_at_trx_commit = 2 для случаев, когда небольшая потеря данных не критична (например, вы используете дублирование и сможете восстановить небольшую потерю). В этом случае транзакции будут сбрасываться в лог на диск только раз в секунду.

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

Innodb_flush_log_at_trx_commit = 2

# Значительное ускорение записи в базу, однако это потребует механизмов дублирования данных

query_cache_size

Значение этого параметра определяет сколько памяти стоит использовать под кеш запросов. Самый правильный подход — не полагаться на этот механизм. На практике он работает очень неэффективно. Так, весь кеш запросов для определенной таблицы сбрасывается всякий раз, когда в таблицу вносится хотя бы одно изменение. Это может привести к тому, что включение кеширования даже замедлит базу данных:

Query_cache_size = 0

# Однако убедитесь, что используете индексы для обеспечения высокой скорости работы запросов

max_connections

Не следует изменять значение этого параметра на старте. Однако, если вы получаете ошибки "Too many connections" , эту опцию стоит поднимать. Она определяет максимальное количество одновременных соединений с базой данных:

Max_connections = 256

# Поднимайте значение постепенно при появлении ошибок соединений

TL;DR

Настройки по умолчанию скорее всего не подойдут. Поэтому обязательно стоит пройтись по указанным параметрам в статье и подобрать для них значения. Если совсем лень — .