Задержка запросов MySQL - есть ли более эффективное решение для этого MySQL Query? - PullRequest
0 голосов
/ 20 января 2019
SELECT post_title, 
       count(*) AS c
FROM wp_posts
WHERE post_type = "product"
GROUP BY post_title
HAVING c > 1
ORDER BY c DESC

работает без проблем, возвращает результат в течение <1 сек.Тем не менее, </p>

select * from wp_posts where post_title in (
    select post_title from wp_posts WHERE post_type = "product"
    group by post_title having count(*) > 1
)

зависает.

Тем не менее, это в основном один и тот же запрос, за исключением того факта, что во втором запросе я пытаюсь извлечь всю запись, а не только post_title.

Я ошибся?Есть ли более эффективный способ получить эквивалент?

Редактировать: EXPLAIN запрос и SHOW CREATE TABLE wp_posts был добавлен для вашей информации.enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Наиболее эффективный способ написания этого запроса, вероятно, использует exists. , , при условии, что wp_posts имеет первичный ключ:

select p.*
from wp_posts p
where p.post_type = 'product' and
      exists (select 1
              from wp_posts p2
              where p2.post_title = p.post_title and
                    p2.post_type = p.post_type and
                    p2.id <> p.id
             );

Для производительности вам нужен индекс на wp_posts(post_type, title, id).

0 голосов
/ 20 января 2019

вы можете избежать предложения IN в подзапросе и использовать внутреннее соединение

select a.* 
from wp_posts a
INNER JOIN (
    select post_title 
    from wp_posts 
    WHERE post_type = "product"
    group by post_title 
    having count(*) > 1
) t ON t.post_title = a.post_title

это должно быть более производительным

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