LINUX.ORG.RU
ФорумAdmin

Интерпретация профилировщика mysql

 


0

1

Есть таблица с примерно 1млн. записей, InnoDB. Запрос вида

SELECT ID FROM messages WHERE comments LIKE '%test%' ORDER BY time LIMIT 10;

выполняется 2,79с. Выхлоп show profile:

| preparing                      | 0.000023 |
| executing                      | 0.000003 |
| Sorting result                 | 2.781331 |
| Sending data                   | 0.000281 |
| end                            | 0.000006 |
| query end                      | 0.000006 |

explain:

+----+-------------+----------+------+---------------+------+---------+------+--------+-----------------------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows   | Extra                       |
+----+-------------+----------+------+---------------+------+---------+------+--------+-----------------------------+
|  1 | SIMPLE      | messages | ALL  | NULL          | NULL | NULL    | NULL | 955319 | Using where; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+--------+-----------------------------+

Теперь то же самое, но без ORDER BY:

| preparing                      | 0.000009 |
| executing                      | 0.000002 |
| Sending data                   | 2.003370 |
| end                            | 0.000015 |
| query end                      | 0.000007 |
+----+-------------+----------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+----------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | messages | ALL  | NULL          | NULL | NULL    | NULL | 955319 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+--------+-------------+

В первом случае, я так понимаю, задержка может быть из-за того что нет индексов для столбца time, по которому производится сортировка. Но почему во втором случае есть задержка в sending data, а в первом случае оно стремится к нулю? Значит ли это что если добавить индекс, то выполняться будет всё равно с задержкой, но теперь уже на этапе sending data?


примерно 1млн. записей
WHERE comments LIKE '%test%'

Не стоит так делать. На сколько я понимаю LIKE не использует индексы, лопатит все строки, это дорого. На сколько я понимаю бОльшая часть времени выполнения запроса это именно перебор «примерно 1млн. записей», почему это время в show profile идёт то в «Sorting result» то в «Sending data» — не знаю.

MrClon ★★★★★ ()

Индексы работают только при точном условии, коим LIKE '%blah%' не является, замени её на LIKE 'blah'.

Еще есть вот это

А вообще использование LIKE это упоринум форте, это очень медленно. Если нужен полнотекстовый поиск то он есть в InnoDb.

invokercd ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.