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. -- Aleksander 'A.L.E.C' Machniak LAN Management System Developer [http://lms.org.pl] Roundcube Webmail Developer [http://roundcube.net] --------------------------------------------------- PGP: 19359DC1 @@ GG: 2275252 @@ WWW: http://alec.pl