On 29.03.2011 08:22, Marek Konieczny wrote:
po tuningu zaproponowanego prze ALEC'a spadlo do 12
Zapytanie wygląda w małym uproszczeniu tak:
SELECT n.id, n.mac FROM vnodes n WHERE ( LOWER(n.name) LIKE LOWER('%abc%') OR LOWER(n.mac) LIKE LOWER('%abc%') ) AND NOT EXISTS ( SELECT 1 FROM customerassignments a JOIN excludedgroups e ON (a.customergroupid = e.customergroupid) WHERE e.userid = lms_current_user() AND a.customerid = n.ownerid ) ORDER BY n.name LIMIT 15
Zrób testy. Najpierw uruchom całe zapytanie, żeby mieć czas do porównania. Następnie wykonaj: 1. to samo usuwając ORDER BY i LIMIT, 2. usuwając j.w. oraz AND NOT EXISTS... 3. usuwając j.w. oraz OR LOWER(mac) LIKE LOWER('%abc%') 4. takie zapytanie:
SELECT n.id, m.mac FROM nodes n JOIN ( SELECT nodeid, GROUP_CONCAT(mac SEPARATOR ',') AS mac FROM macs GROUP BY nodeid ) m ON (n.id = m.nodeid) WHERE ( LOWER(n.name) LIKE LOWER('%abc%') OR LOWER(m.mac) LIKE LOWER('%abc%') ) AND NOT EXISTS ( SELECT 1 FROM customerassignments a JOIN excludedgroups e ON (a.customergroupid = e.customergroupid) WHERE e.userid = lms_current_user() AND a.customerid = n.ownerid ) ORDER BY n.name LIMIT 15
5. takie zapytanie:
SELECT n.id, (SELECT GROUP_CONCAT(mac SEPARATOR ',') FROM macs WHERE nodeid = n.id) AS mac FROM nodes n WHERE ( LOWER(n.name) LIKE LOWER('%abc%') OR EXISTS (SELECT 1 FROM macs LOWER(mac) LIKE LOWER('%abc%') WHERE nodeid = n.id LIMIT 1) ) AND NOT EXISTS ( SELECT 1 FROM customerassignments a JOIN excludedgroups e ON (a.customergroupid = e.customergroupid) WHERE e.userid = lms_current_user() AND a.customerid = n.ownerid ) ORDER BY n.name LIMIT 15
Podaj czasy wszystkich tych zapytań oraz wersję mysqla. Możesz też podać explain głównego zapytania oraz najszybszego.