MySQL "Отправка данных" ужасно медленная - PullRequest
15 голосов
/ 18 сентября 2009

У меня есть таблица скромного размера, 277 тыс. Записей на данный момент, по которой я пытаюсь выполнить поиск FULLTEXT. Поиск кажется очень быстрым, пока не дойдет до фазы отправки данных.

Таблица:

CREATE TABLE `sqinquiries_inquiry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ts` datetime NOT NULL,
  `names` longtext NOT NULL,
  `emails` longtext NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `sqinquiries_inquiry_search` (`names`,`emails`)
) ENGINE=MyISAM AUTO_INCREMENT=305560 DEFAULT CHARSET=latin1

Запрос:

SELECT * FROM `sqinquiries_inquiry` WHERE (
  MATCH (`sqinquiries_inquiry`.`names`) AGAINST ('smith' IN BOOLEAN MODE) OR
  MATCH (`sqinquiries_inquiry`.`emails`) AGAINST ('smith' IN BOOLEAN MODE)
) ORDER BY `sqinquiries_inquiry`.`id` DESC LIMIT 100

Профиль: (я вырвал, казалось бы, бесполезную информацию)

+-------------------------+----------+
| Status                  | Duration |
+-------------------------+----------+
| preparing               | 0.000014 | 
| FULLTEXT initialization | 0.000015 | 
| executing               | 0.000004 | 
| Sorting result          | 0.000008 | 
| Sending data            | 2.247934 | 
| end                     | 0.000011 | 
| query end               | 0.000003 | 
+-------------------------+----------+

DESCRIBE выглядит великолепно, простой вкладыш: Описание:

id: 1
select_type: SIMPLE
table: sqinquiries_inquiry
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4 
ref: NULL
rows: 100
Extra: Using where

Так что я не понимаю, откуда идут 2,25 секунды отправки данных? Я вижу похожую производительность в Python и в консольном mysql приложении, оба подключаются к localhost.

Обновление:

  • За комментарий, запрашивающий средний размер строки, это: 53,8485
  • За комментарий, вот DESCRIBE выше.

Ответы [ 2 ]

32 голосов
/ 18 сентября 2009

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. Отредактировано для удаления понижающего голоса:)

0 голосов
/ 18 сентября 2009

Я думаю, что вы передаете много данных при медленном сетевом соединении.

Вместо выбора * выбирайте только те столбцы, которые вам действительно нужны.

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

Некоторые клиенты поддерживают сжатие пакетов результатов. Может быть, вы хотите посмотреть на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...