воскресенье, 25 января 2015 г.

Увеличение быстродействия работы запросов к 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