Оптимизация запроса

bga83

Нужен совет. Есть запрос вида:
SELECT DISTINCT mw.maintenanceid, m.name, m.active_since, m.active_till, tp.*,h.host
FROM timeperiods tp, maintenances_windows mw, maintenances m, maintenances_groups mg, maintenances_hosts mh, hosts h, hosts_groups hg, items i, functions f, triggers t 
WHERE tp.timeperPRIMARYPRIMARYevents_1events_2iodid=mw.timeperiodid
 AND mw.maintenanceid=m.maintenanceid
 AND t.triggerid=f.triggerid
 AND f.itemid=i.itemid
 AND i.hostid=h.hostid
 AND t.triggerid=13174
 AND ( mg.maintenanceid=m.maintenanceid 
 AND h.hostid=hg.hostid 
 AND hg.groupid=mg.groupid 
 OR h.hostid=mh.hostid 
 AND mh.maintenanceid=m.maintenanceid )
Проблема в том, что он довольно долго выполняется. Можно ли как-то попытаться увеличить быстродействие? индексы(то по каким полям), разбить на несколько запросов?
3 ответа

bga83

Нормально так... где DDL? где explain? В ремонте у нас хрустальный шар, знаете ли...


bga83

bga83,ты, пт-ешник, очень зря тегами не пользуешся ...----1оптимизировать можно избавившись от OR-а - тут
( mg.maintenanceid=m.maintenanceid 
AND h.hostid=hg.hostid 
AND hg.groupid=mg.groupid 
OR h.hostid=mh.hostid 
AND mh.maintenanceid=m.maintenanceid )
разделив на 2-а запроса и объеденив их по union2когда будеш разделять на 2-а запроса - увидеш, что во-втором получается cross joinиз-за недостаточности условия здесь -
OR h.hostid=mh.hostid 
AND mh.maintenanceid=m.maintenanceid
скорее всего из-за этого и используется DISTINCT - если получится от него избавится, будет очень хороший плюс3таб.triggers, "в свете этого" - t.triggerid=f.triggerid and t.triggerid=13174 - можно вообще убрать, - f.triggerid=131744и join-ами делать, join-ами


bga83

qwerty112,спс посмотрю, про join и union читать и пробовать надо. От DISTINCT избавиться не выйдет, это структура базы такая(Zabbix).PS я вообще в принципе админ, щас просто пришлось влезть в программерство немного, поэтому много где подтупливаю