Как отсортировать только отфильтрованный набор результатов, а не всю таблицу - PullRequest
0 голосов
/ 13 октября 2019

Я где-то читал здесь, что ORDER BY сортирует только отфильтрованный набор, когда присутствует предложение WHERE. Я вижу некоторые другие результаты.

В моей таблице ~ 550 тыс. Записей, следующий запрос завершается через ~ 2,5 секунды:

SELECT
    *
FROM
    scrapings
WHERE MATCH (title, descr) AGAINST ("young" IN BOOLEAN MODE)
ORDER BY
    dt DESC
LIMIT 100

При удалении предложения ORDER BY времясократить до ~ 0,1 секунды. Как я могу сделать так, чтобы он сортировал только отфильтрованные результаты?

О, и я также попытался удалить предложение WHERE, просто чтобы убедиться, что на сортировку отфильтрованных результатов не уходит ~ 2,5 секунды.

о 2: вот оно EXPLAIN изд: enter image description here

ах 3: вот это DDL

CREATE TABLE `scrapings` (
  `url` varchar(512) NOT NULL,
  `dt` int(11) NOT NULL,
  `title` text CHARACTER SET utf8mb4,
  `descr` text CHARACTER SET utf8mb4,
  `image` varchar(1024) DEFAULT NULL,
  `domain` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`url`,`dt`),
  UNIQUE KEY `image` (`image`),
  FULLTEXT KEY `title` (`title`,`descr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Единственный способ выполнения запроса:

  1. Фильтр с использованием WHERE
  2. Сортировка всего отфильтрованного набора по ORDER BY (здесь не нужен ни один индекс)). Обратите внимание, что он должен был добраться до записей, чтобы найти dt, чтобы он мог сортировать.
  3. Доставить первые 100 (LIMIT)

Если вы удалите WHERE, тоон будет либо сортировать всю таблицу, либо (если у вас есть INDEX(dt), он может использовать индекс, чтобы избежать сортировки.

Если вы удалите только ORDER BY и множество совпадений строк, то он простодоставьте 100 найденных строк первым. Это может быть заметно быстрее.

0 голосов
/ 13 октября 2019

mysql сортирует только выбранные строки.

Если вы хотите знать, почему порядок выполнения занимает так много времени, особенно когда столбец не имеет индекса (поэтому предложения Daniels имеют смысл), это потому, что mysql создает временную таблицурезультатов и сортирует их.

, если кто-то интересуется внутренней работой, прочитайте некоторые из Понимание внутренних функций MySQL: обнаружение и улучшение великолепной базы данных

Но где вы слышали или читали только о MySQL, отсортированномотфильтрованный набор при включении предложения where.

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