DESCRIBE
выглядит великолепно, простой вкладыш.
Поскольку в вашем запросе используется только одна таблица, она не может быть ничем иным, как однострочным.
Однако ваш запрос не использует индекс FULLTEXT
.
Чтобы индекс был пригоден для использования, необходимо немного переписать запрос:
SELECT *
FROM sqinquiries_inquiry
WHERE MATCH (names, emails) AGAINST ('smith' IN BOOLEAN MODE)
ORDER BY
id DESC
LIMIT 100
MATCH
использует индекс только в том случае, если вы сопоставляете точный набор столбцов, для которых определен индекс.
Таким образом, ваш запрос использует сканирование индекса на id
: Using index; Using where
в самом конце вашего DESCRIBE
.
Sending data
вводит в заблуждение: фактически это время, прошедшее между окончанием предыдущей операции и окончанием текущей операции.
Например, я просто запустил этот запрос:
SET profiling = 1;
SELECT *
FROM t_source
WHERE id + 1 = 999999;
SHOW PROFILE FOR QUERY 39;
, который вернул одну строку и этот профиль:
'starting', 0.000106
'Opening tables', 0.000017
'System lock', 0.000005
'Table lock', 0.000014
'init', 0.000033
'optimizing', 0.000009
'statistics', 0.000013
'preparing', 0.000010
'executing', 0.000003
'Sending data', 0.126565
'end', 0.000007
'query end', 0.000004
'freeing items', 0.000053
'logging slow query', 0.000002
'cleaning up', 0.000005
Поскольку индекс нельзя использовать, MySQL
необходимо выполнить полное сканирование таблицы.
0.126565
секунд - это время от начала выполнения (время, когда была прочитана первая строка) и конца выполнения (время, когда последняя строка была отправлена клиенту).
Эта последняя строка находится в самом конце таблицы, и ее поиск и отправка заняли много времени.
P. S.
Отредактировано для удаления понижающего голоса:)