Увеличение быстродействия работы запросов к Mysql базе
1. Для увеличения быстродействия запроса к базе необходимо создать индексы по тем полям, по которым происходит выборка
2. Оценить работу индексов можно с помощью MySQL команды:
# mysql -uroot -p
mysql> show status LIKE "Key%";
+------------------------+------------+
| Variable_name | Value |
+------------------------+------------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 0 |
| Key_blocks_used | 7245 |
| Key_read_requests | 3198558370 |
| Key_reads | 83092953 |
| Key_write_requests | 523764266 |
| Key_writes | 26274446 |
+------------------------+------------+
7 rows in set (0.03 sec)
Отношение Key_read_requests к Key_reads должно быть больше 100.
Как видно в этом листинге, база работает не оптимально.
В этом работает оптимально:
+------------------------+------------+
| Variable_name | Value |
+------------------------+------------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 0 |
| Key_blocks_used | 463920 |
| Key_read_requests | 1158715611 |
| Key_reads | 4037304 |
| Key_write_requests | 278623571 |
| Key_writes | 19264969 |
+------------------------+------------+
7 rows in set (0.07 sec)
3. Создав индексы, поиск в таблице лучше проводить не с помощью оператора LIKE, а указывая точное сопадение совпадение
Например вместо
SELECT FROM logauth201501 WHERE Ip LiKE '%188.168.2.132%'
указывать
SELECT FROM logauth201501 WHERE Ip = '188.168.2.132'
Это подтверждается анализом запросов с помощью оператора EXPLAIN:
mysql> EXPLAIN SELECT * FROM logauth201501 WHERE Ip LIKE '%188.168.2.132%';
+----+-------------+---------------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+------+---------------+------+---------+------+----------+-------------+
| 1 | SIMPLE | logauth201501 | ALL | NULL | NULL | NULL | NULL | 20012317 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+----------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT FROM logauth201501 WHERE Ip = '188.168.2.132';
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------------+
| 1 | SIMPLE | logauth201501 | ref | Ip | Ip | 50 | const | 45 | Using where |
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)
Видно, что в первом случае столбец rows (сколько строк нужно просмотреть mysql, что бы получить результат) - равно огромному числу - 20012317
Во втором случае - 45. Поэтому запросы с точным совпадением работать будут быстрее.
4. Для увеличения быстродействия стоит так же увеличить размер буфера хранения индексов в файле my.cfg
#nano /etc/my.cnf
Прописываем в разел [mysqld]
max_allowed_packet=10M
key_buffer_size=512M
Рестратуем сервис Mysql
#service mysqld restart
1. Для увеличения быстродействия запроса к базе необходимо создать индексы по тем полям, по которым происходит выборка
2. Оценить работу индексов можно с помощью MySQL команды:
# mysql -uroot -p
mysql> show status LIKE "Key%";
+------------------------+------------+
| Variable_name | Value |
+------------------------+------------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 0 |
| Key_blocks_used | 7245 |
| Key_read_requests | 3198558370 |
| Key_reads | 83092953 |
| Key_write_requests | 523764266 |
| Key_writes | 26274446 |
+------------------------+------------+
7 rows in set (0.03 sec)
Отношение Key_read_requests к Key_reads должно быть больше 100.
Как видно в этом листинге, база работает не оптимально.
В этом работает оптимально:
+------------------------+------------+
| Variable_name | Value |
+------------------------+------------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 0 |
| Key_blocks_used | 463920 |
| Key_read_requests | 1158715611 |
| Key_reads | 4037304 |
| Key_write_requests | 278623571 |
| Key_writes | 19264969 |
+------------------------+------------+
7 rows in set (0.07 sec)
3. Создав индексы, поиск в таблице лучше проводить не с помощью оператора LIKE, а указывая точное сопадение совпадение
Например вместо
SELECT FROM logauth201501 WHERE Ip LiKE '%188.168.2.132%'
указывать
SELECT FROM logauth201501 WHERE Ip = '188.168.2.132'
Это подтверждается анализом запросов с помощью оператора EXPLAIN:
mysql> EXPLAIN SELECT * FROM logauth201501 WHERE Ip LIKE '%188.168.2.132%';
+----+-------------+---------------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+------+---------------+------+---------+------+----------+-------------+
| 1 | SIMPLE | logauth201501 | ALL | NULL | NULL | NULL | NULL | 20012317 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+----------+-------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT FROM logauth201501 WHERE Ip = '188.168.2.132';
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------------+
| 1 | SIMPLE | logauth201501 | ref | Ip | Ip | 50 | const | 45 | Using where |
+----+-------------+---------------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)
Видно, что в первом случае столбец rows (сколько строк нужно просмотреть mysql, что бы получить результат) - равно огромному числу - 20012317
Во втором случае - 45. Поэтому запросы с точным совпадением работать будут быстрее.
4. Для увеличения быстродействия стоит так же увеличить размер буфера хранения индексов в файле my.cfg
#nano /etc/my.cnf
Прописываем в разел [mysqld]
max_allowed_packet=10M
key_buffer_size=512M
Рестратуем сервис Mysql
#service mysqld restart