Время медленного выполнения запроса - PullRequest
0 голосов
/ 21 марта 2012
SELECT p.id, 
       p.title, 
       p.slug, 
       p.content, 
       (SELECT url 
        FROM   gallery 
        WHERE  postid = p.id 
        LIMIT  1) AS url, 
       t.name 
FROM   posts AS p 
       INNER JOIN termrel AS tr 
         ON ( tr.object = p.id ) 
       INNER JOIN termtax AS tx 
         ON ( tx.id = tr.termtax_id ) 
       INNER JOIN terms AS t 
         ON ( t.id = tx.term_id ) 
WHERE  tx.taxonomy_id = 3 
       AND p.post_status IS NULL 
ORDER  BY t.name ASC 

Для выполнения этого запроса потребовалось около 0,2407 с.Как сделать это быстро?

1 Ответ

0 голосов
/ 29 марта 2012

Коррелированные подзапросы могут иметь производительность на низком уровне, поскольку они выполняются строка за строкой. Чтобы решить эту проблему, переместите коррелированный подзапрос в обычный подзапрос / производную таблицу и присоединитесь к ней.В этом случае он не будет выполнять строку за строкой для всего возвращенного набора результатов, поскольку он будет выполнен ДО оператора выбора.

MySQL ссылки, которые подтверждают коррелированные подзапросы, не являются оптимальным выбором в MySQL. Как оптимизировать Ответ, указывающий, что msql печально известен плохой оптимизацией коррелированных подзапросов

Я использую sql-сервер, но я уверен, что принцип тот же дляmysql , поэтому я надеюсь, что это, по крайней мере, укажет вам правильное направление.Вам нужно будет разделить / вернуть ваш один результат по каждому кредиту, возможно, кто-то может вмешаться в специфический синтаксис mysql, и я мог бы обновить свой ответ

select
    p.id
   ,p.title
   ,p.slug
   ,p.content
   ,t.name
   ,mySubQuery.value
from
    posts as p
    inner join termrel as tr
    on ( tr.object = p.id )
    inner join termtax as tx
    on ( tx.id = tr.termtax_id )
    inner join terms as t
    on ( t.id = tx.term_id )

    left join (
                -- use MYSQL function to partition the reslts and only return 1, I use sql-server, not sure of the RDMS specific syntax
                select
                id
                ,url
                from
                    gallery
                limit 1
              ) as mySubquery
    on mySubquery.id = p.id


where
    tx.taxonomy_id = 3
    and p.post_status is null
order by
    t.name asc 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...