2013-03-25 5 views
0

Вот мой запрос, который работает с помощью двух подзапросов и временных таблиц:Повышение производительности подзапроса в MySQL

select visit.pid, visit.pidvnum, visit.hpv16, visit.qc_hst 
FROM visit, 
    (select distinct x.pid from 
     (select pid from visit where visit.qc_hst = 1) x, 
     (select pid from visit where visit.hpv16 = 1) y 
    where x.pid = y.pid) as subtbl 
where visit.pid = subtbl.pid 
AND (visit.qc_hst = 1 OR visit.hpv16 =1); 

Есть ли способ, чтобы переписать этот запрос, чтобы исключить один или оба из подзапросов? Я также использовал предложение IN с теми же двумя подзапросами, но это еще хуже. Я не могу индексировать такие поля, как qc_hst и hpv16, поскольку их десятки, и любой из них потенциально может быть частью запроса.

Вот ссылка sqlfiddle: http://sqlfiddle.com/#!2/68bd6/6/0

Большое спасибо - я действительно стучал головой о стену на этом ...

ответ

1

появляется Ваш запрос, ищет записи, где PID выполняет оба этих условия. Ниже альтернативный подход:

select v.pid, v.pidvnum, v.hpv16, v.qc_hst 
from visit v join 
    (select v.pid 
     from visit v 
     where visit.qc_hst = 1 or visit.hpv16 = 1 
     group by pid 
     having SUM(v.qc_hst = 1) > 0 and sum(v.hpv16 = 1) > 0 
    ) vp 
    on v.pid = vp.pid 
where visit.qc_hst = 1 or visit.hpv16 = 1 

Индекс по visit(pid), вероятно, поможет любой из запросов работать быстрее.

+0

Правильно - оба условия должны выполняться на pid (который является родительским ключом), но не на pidvnum (который является основным ключом). Ваше решение выглядит довольно хорошо - «объяснение» выглядит чертовски много лучше! Тем не менее, это немного «многословие», что сделает его общее кодирование в Java немного сложным. Я дам вам знать, как это работает завтра. – MikeBopf

+0

Хорошо, похоже, что он работает довольно спокойно, даже когда присоединяется к нескольким более нисходящим столам - вот что меня убило. Меня устраивает! – MikeBopf

Смежные вопросы