Запрашивает индексированную таблицу MySQL с 67156 строками, проверяет 162880 рядов. Индекс не работает? - PullRequest
1 голос
/ 23 марта 2020

Я запрашиваю wp_posts таблицу в моей базе данных.

Текущие индексы указаны ниже:

enter image description here

Я запускаю следующее query:

SELECT MIN(post_parent) 
FROM wp_posts 
WHERE  post_type = 'product_variation' and post_parent > 365191;

он проверяет 162880 строк, как показано ниже:

enter image description here

Однако там следующий запрос возвращает только 67156 строки.

SELECT COUNT(*) 
FROM wp_posts 
WHERE  post_type = 'product_variation' and post_parent > 365191;

Так почему мой индекс не работает, как я ожидал?

PS: post_parent is bigInt

Ответы [ 3 ]

3 голосов
/ 23 марта 2020

Ваш индекс «работает», но он бесполезен для этого запроса.

По сути, одна из целей индекса - сократить количество страниц данных, которые необходимо прочитать. Когда есть запрос, который читает 67 156 из 16 2880 строк, оптимизатор считает, что все страницы данных должны быть прочитаны в любом случае . Итак, зачем использовать индекс.

Как примечание, для этого запроса:

SELECT MIN(post_parent)
FROM wp_posts
WHERE post_type = 'product_variation' and post_parent > 365191;

Оптимальный индекс на wp_posts(post_type, post_parent). Я предполагаю, что этот индекс будет фактически использоваться, потому что это индекс покрытия для запроса. Таким образом, чтение индекса имеет преимущества перед чтением оригинальных страниц данных.

1 голос
/ 23 марта 2020

Ваш индекс "работает", но он только частично , полезный для этого запроса.

Вы не раскрыли точные детали индекса type_status_date, но на основе name Я предполагаю, что он индексирует поля типа записи, статуса публикации и даты публикации, в этом конкретном порядке.

Это означает, что type_status_date может использоваться только для сужения результатов на основе типа записи, но не может быть используется для поиска родительского поста, поскольку последнее поле не является частью индекса. Mysql может использовать только один индекс для таблицы в запросе.

Если вы выполнили запрос

SELECT COUNT(*) 
FROM wp_posts 
WHERE  post_type = 'product_variation'

, то счетчик, вероятно, будет намного ближе к отсканированным строкам подсчитайте в объяснении.

Как объяснил Гордон, индекс по типу поста, родительские поля поста будут более эффективными в этом случае.

0 голосов
/ 23 марта 2020
  • "Строки" в EXPLAIN являются приблизительными; Иногда очень далеко дайте ответ.
  • Объяснение будет указывать «покрытие», говоря «Использование индекса» (не «Использование условия индекса»).
  • EXPLAIN не всегда понижает «Строки» для учета для LIMIT, MIN и др. c. Опять же, вы не всегда можете доверять этому. Смотрите это для точного подсчета: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#handler_counts
...