Как оптимизировать MySQL с помощью Query Cache в Ubuntu 18.04

Автор выбралApache Software Foundation для получения пожертвования в рамках программыWrite for DOnations.

Вступление

Query cache - важная функцияMySQL, которая ускоряет извлечение данных из базы данных. Он достигает этого, сохраняя операторы MySQLSELECT вместе с полученным набором записей в памяти, а затем, если клиент запрашивает идентичные запросы, он может обслуживать данные быстрее без повторного выполнения команд из базы данных.

По сравнению с данными, считанными с диска, кэшированные данные из ОЗУ (оперативного запоминающего устройства) имеют более короткое время доступа, что уменьшает задержку и улучшает операции ввода / вывода (I / O). Например, для сайта WordPress или портала электронной коммерции с высокими требованиями к чтению и редкими изменениями данных кэш запросов может значительно повысить производительность сервера базы данных и сделать его более масштабируемым.

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

[.note] #Note: Несмотря на то, что кеш запросов устарел в MySQL 5.7.20 и удален в MySQL 8.0, он по-прежнему является мощным инструментом, если вы используете поддерживаемые версии MySQL. Однако, если вы используете более новые версии MySQL, вы можете использовать альтернативные сторонние инструменты, такие какProxySQL, для оптимизации производительности вашей базы данных MySQL.
#

Предпосылки

Прежде чем начать, вам понадобится следующее:

  • Один сервер Ubuntu 18.04, настроенный с брандмауэром и пользователем без полномочий root. Вы можете обратиться к руководствуInitial Server Setup with Ubuntu 18.04, чтобы настроить свой сервер.

  • Сервер MySQL настроен, как описано в этом руководствеHow To Install MySQL on Ubuntu 18.04. Убедитесь, что вы установили пароль root для сервера MySQL.

[[step-1 -—- verify-availability-of-query-cache]] == Шаг 1. Проверка доступности кеша запросов

Перед настройкой кэша запросов вы проверите, поддерживает ли ваша версия MySQL эту функцию. Во-первых,ssh на ваш сервер Ubuntu 18.04:

ssh user_name@your_server_ip

Затем выполните следующую команду, чтобы войти на сервер MySQL от имени пользователя root:

sudo mysql -u root -p

При появлении запроса введите корневой пароль сервера MySQL и нажмитеENTER, чтобы продолжить.

Используйте следующую команду, чтобы проверить, поддерживается ли кэш запросов:

show variables like 'have_query_cache';

Вы должны получить вывод, подобный следующему:

Output+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.01 sec)

Вы можете видеть, что значениеhave_query_cache установлено наYES, и это означает, что поддерживается кеш запросов. Если вы получили вывод о том, что ваша версия не поддерживает кэш запросов, см. Примечание в разделе «Введение» для получения дополнительной информации.

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

[[шаг-2 -—- check-the-default-query-cache-variables]] == Шаг 2. Проверка переменных кэша запросов по умолчанию

В MySQL ряд переменных контролирует кеш запросов. На этом этапе вы проверите значения по умолчанию, которые поставляются с MySQL, и поймете, что контролирует каждая переменная.

Вы можете проверить эти переменные, используя следующую команду:

show variables like 'query_cache_%' ;

Вы увидите переменные, перечисленные в вашем выводе:

Output+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_type             | OFF      |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
5 rows in set (0.00 sec)

Значениеquery_cache_limit определяет максимальный размер отдельных результатов запроса, которые могут быть кэшированы. Значение по умолчанию составляет 1 048 576 байт, что эквивалентно 1 МБ.

MySQL не обрабатывает кэшированные данные в одном большом блоке; вместо этого он обрабатывается блоками. Минимальный объем памяти, выделяемой каждому блоку, определяется переменнойquery_cache_min_res_unit. Значение по умолчанию составляет 4096 байт или 4 КБ.

query_cache_size контролирует общий объем памяти, выделенной для кеша запросов. Если значение установлено равным нулю, это означает, что кеш запросов отключен. В большинстве случаев значение по умолчанию может быть установлено на 16 777 216 (около 16 МБ). Также имейте в виду, чтоquery_cache_size требуется не менее 40 КБ для размещения своих структур. Выделенное здесь значение выравнивается по ближайшему 1024-байтовому блоку. Это означает, что сообщаемое значение может немного отличаться от установленного вами.

MySQL определяет запросы для кеширования, исследуя переменнуюquery_cache_type. Установка этого значения на0 илиOFF предотвращает кеширование или получение кэшированных запросов. Вы также можете установить его на1, чтобы включить кеширование для всех запросов, кроме тех, которые начинаются с оператораSELECT SQL_NO_CACHE. Значение2 указывает MySQL кэшировать только запросы, начинающиеся с командыSELECT SQL_CACHE.

Переменнаяquery_cache_wlock_invalidate определяет, должен ли MySQL получать результаты из кеша, если таблица, используемая в запросе, заблокирована. Значение по умолчанию -OFF.

[.note] #Note: Переменнаяquery_cache_wlock_invalidate устарела, начиная с версии MySQL 5.7.20. В результате вы можете не увидеть это в своих выводах в зависимости от версии MySQL, которую вы используете.
#

Изучив системные переменные, которые управляют кэшем запросов MySQL, вы теперь протестируете, как работает MySQL, без предварительного включения этой функции.

[[step-3 -—- testing-your-mysql-server-without-query-cache]] == Шаг 3. Тестирование вашего сервера MySQL без кэша запросов

Цель этого руководства - оптимизировать сервер MySQL с помощью функции кэширования запросов. Чтобы увидеть разницу в скорости, вы будете запускать запросы и видеть их производительность до и после реализации этой функции.

На этом шаге вы создадите пример базы данных и вставите некоторые данные, чтобы увидеть, как MySQL работает без кеша запросов.

Все еще находясь на сервере MySQL, создайте базу данных и назовите ееsample_db, выполнив следующую команду:

Create database sample_db;
OutputQuery OK, 1 row affected (0.00 sec)

Затем переключитесь на базу данных:

Use sample_db;
OutputDatabase changed

Создайте таблицу с двумя полями (customer_id иcustomer_name) и назовите ееcustomers:

Create table customers (customer_id INT PRIMARY KEY, customer_name VARCHAR(50) NOT NULL) Engine = InnoDB;
OutputQuery OK, 0 rows affected (0.01 sec)

Затем выполните следующие команды, чтобы вставить пример данных:

Insert into customers(customer_id, customer_name) values ('1', 'JANE DOE');
Insert into customers(customer_id, customer_name) values ('2', 'JANIE DOE');
Insert into customers(customer_id, customer_name) values ('3', 'JOHN ROE');
Insert into customers(customer_id, customer_name) values ('4', 'MARY ROE');
Insert into customers(customer_id, customer_name) values ('5', 'RICHARD ROE');
Insert into customers(customer_id, customer_name) values ('6', 'JOHNNY DOE');
Insert into customers(customer_id, customer_name) values ('7', 'JOHN SMITH');
Insert into customers(customer_id, customer_name) values ('8', 'JOE BLOGGS');
Insert into customers(customer_id, customer_name) values ('9', 'JANE POE');
Insert into customers(customer_id, customer_name) values ('10', 'MARK MOE');
OutputQuery OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
...

Следующим шагом будет запускMySQL profiler, службы анализа для мониторинга производительности запросов MySQL. Чтобы включить профиль для текущего сеанса, выполните следующую команду, установив для него значение1, которое включено:

SET profiling = 1;
OutputQuery OK, 0 rows affected, 1 warning (0.00 sec)

Затем выполните следующий запрос для получения всех клиентов:

Select * from customers;

Вы получите следующий вывод:

Output+-------------+---------------+
| customer_id | customer_name |
+-------------+---------------+
|           1 | JANE DOE      |
|           2 | JANIE DOE     |
|           3 | JOHN ROE      |
|           4 | MARY ROE      |
|           5 | RICHARD ROE   |
|           6 | JOHNNY DOE    |
|           7 | JOHN SMITH    |
|           8 | JOE BLOGGS    |
|           9 | JANE POE      |
|          10 | MARK MOE      |
+-------------+---------------+
10 rows in set (0.00 sec)

Затем запустите командуSHOW PROFILES, чтобы получить информацию о производительности только что выполненного запросаSELECT:

SHOW PROFILES;

Вы получите вывод, подобный следующему:

Output+----------+------------+-------------------------+
| Query_ID | Duration   | Query                   |
+----------+------------+-------------------------+
|        1 | 0.00044075 | Select * from customers |
+----------+------------+-------------------------+
1 row in set, 1 warning (0.00 sec)

Выходные данные показывают общее время, потраченное MySQL при извлечении записей из базы данных. Вы собираетесь сравнить эти данные на следующих шагах, когда включен кеш запросов, поэтому запомните свойDuration. Вы можете игнорировать предупреждение в выводе, поскольку оно просто указывает, что командаSHOW PROFILES будет удалена в будущем выпуске MySQL и заменена наPerformance Schema.

Затем выйдите из интерфейса командной строки MySQL.

quit;

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

[[step-4 -—- setting-up-query-cache]] == Шаг 4. Настройка кеша запросов

На предыдущем шаге вы создали образец данных и выполнили операторSELECT перед включением кеширования запросов. На этом шаге вы включите кеш запросов, отредактировав файл конфигурации MySQL.

Используйтеnano для редактирования файла:

sudo nano /etc/mysql/my.cnf

Добавьте следующую информацию в конец вашего файла:

/etc/mysql/my.cnf

...
[mysqld]
query_cache_type=1
query_cache_size = 10M
query_cache_limit=256K

Здесь вы включили кеширование запросов, установив дляquery_cache_type значение1. Вы также установили максимальный размер отдельного запроса на256K и дали указание MySQL выделить10 мегабайт для кеша запросов, установив значениеquery_cache_size на10M.

Сохраните и закройте файл, нажавCTRL +X,Y, затемENTER. Затем перезапустите сервер MySQL, чтобы изменения вступили в силу:

sudo systemctl restart mysql

Теперь вы включили кеш запросов.

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

[[step-5 -—- testing-your-mysql-server-with-query-cache-enabled]] == Шаг 5. Тестирование сервера MySQL с включенным кешем запросов

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

Сначала подключитесь к серверу MySQL как пользовательroot:

sudo mysql -u root -p

Введите свой парольroot для сервера базы данных и нажмитеENTER, чтобы продолжить.

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

show variables like 'query_cache_%' ;

Вы увидите следующий вывод:

Output+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 262144   |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 10485760 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
5 rows in set (0.01 sec)

Переменнаяquery_cache_type установлена ​​наON; это подтверждает, что вы включили кэш запросов с параметрами, определенными на предыдущем шаге.

Переключитесь на базу данныхsample_db, которую вы создали ранее.

Use sample_db;

Запустите MySQL профилировщик:

SET profiling = 1;

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

Помните, что после того, как вы выполните первый запрос, MySQL создаст кеш результатов, и поэтому вы должны выполнить запрос дважды, чтобы вызвать кеш:

Select * from customers;
Select * from customers;

Затем перечислите информацию о профилях:

SHOW PROFILES;

Вы получите вывод, подобный следующему:

Output+----------+------------+-------------------------+
| Query_ID | Duration   | Query                   |
+----------+------------+-------------------------+
|        1 | 0.00049250 | Select * from customers |
|        2 | 0.00026000 | Select * from customers |
+----------+------------+-------------------------+
2 rows in set, 1 warning (0.00 sec)

Как видите, время, необходимое для выполнения запроса, резко сократилось с0.00044075 (без кеширования запросов на шаге 3) до0.00026000 (второй запрос) на этом шаге.

Вы можете увидеть оптимизацию от включения функции кэширования запросов, детально профилировав первый запрос:

SHOW PROFILE FOR QUERY 1;
Output+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000025 |
| Waiting for query cache lock   | 0.000004 |
| starting                       | 0.000003 |
| checking query cache for query | 0.000045 |
| checking permissions           | 0.000008 |
| Opening tables                 | 0.000014 |
| init                           | 0.000018 |
| System lock                    | 0.000008 |
| Waiting for query cache lock   | 0.000002 |
| System lock                    | 0.000018 |
| optimizing                     | 0.000003 |
| statistics                     | 0.000013 |
| preparing                      | 0.000010 |
| executing                      | 0.000003 |
| Sending data                   | 0.000048 |
| end                            | 0.000004 |
| query end                      | 0.000006 |
| closing tables                 | 0.000006 |
| freeing items                  | 0.000006 |
| Waiting for query cache lock   | 0.000003 |
| freeing items                  | 0.000213 |
| Waiting for query cache lock   | 0.000019 |
| freeing items                  | 0.000002 |
| storing result in query cache  | 0.000003 |
| cleaning up                    | 0.000012 |
+--------------------------------+----------+
25 rows in set, 1 warning (0.00 sec)

Выполните следующую команду, чтобы отобразить информацию профиля для второго запроса, который кэшируется:

SHOW PROFILE FOR QUERY 2;
Output+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000024 |
| Waiting for query cache lock   | 0.000003 |
| starting                       | 0.000002 |
| checking query cache for query | 0.000006 |
| checking privileges on cached  | 0.000003 |
| checking permissions           | 0.000027 |
| sending cached result to clien | 0.000187 |
| cleaning up                    | 0.000008 |
+--------------------------------+----------+
8 rows in set, 1 warning (0.00 sec)

Выводы из профилировщика показывают, что MySQL потребовал меньше времени на втором запросе, потому что он мог получать данные из кэша запросов, а не считывать их с диска. Вы можете сравнить два набора вывода для каждого из запросов. Если вы посмотрите на информацию профиля наQUERY 2, статусsending cached result to client показывает, что данные были прочитаны из кеша и таблицы не были открыты, так как статусOpening tables отсутствует.

Если на вашем сервере включена функция кеширования запросов MySQL, вы сможете повысить скорость чтения.

Заключение

Вы настроили кеш запросов для ускорения работы сервера MySQL в Ubuntu 18.04. Использование таких функций, как кэш запросов MySQL, может повысить скорость работы вашего веб-сайта или веб-приложения. Кэширование уменьшает ненужное выполнение операторов SQL и является очень рекомендуемым и популярным методом оптимизации вашей базы данных. Чтобы узнать больше об ускорении вашего сервера MySQL, попробуйте учебникHow To Set Up a Remote Database to Optimize Site Performance with MySQL on Ubuntu 18.04.

Related