Joyride Posted August 19, 2010 Report Share Posted August 19, 2010 Vaicājums apmēram šāds: SELECT a.field1, SUM(b.field2) AS smth1, GROUP_CONCAT(c.field3 SEPARATOR ',') AS smth2 ... FROM a LEFT JOIN b ON a.b_id = b.id LEFT JOIN c ON b.c_id = c.id LEFT JOIN d ON b.d_id = d.id LEFT JOIN e ON d.e_id = e.id WHERE ... GROUP BY ... ORDER BY ... LIMIT 0, 50 Izpildes laiks ir ap 12sec. JOINotas astoņas tabulas, citas pie galvenās, citas pie jau JOINotajām. Visām tabulām ir indeksi uz ID un uz tā lauka, ar kuru tiek veikts JOINs. Vienai tabulai ierakstu skaits > 100'000, citai ~50'000, citai ~20'000, pārējās ir pavisam nelielas. Noņemot nost JOINu uz to tabulu, no kuras tiek veikts GROUP_CONCAT, atšķirība minimāla. Ja samazina atlasāmo ierakstu skaitu no 50 uz 25, atšķirība praktiski nekāda. Ko vēl varētu izdarīt, lai šo vaicājumu paātrinātu? Quote Link to comment Share on other sites More sharing options...
Maris-S Posted August 19, 2010 Report Share Posted August 19, 2010 Kas konkrēti ir pēc where, group by un order by? Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted August 19, 2010 Report Share Posted August 19, 2010 Kāds izskatās vaicājuma izpildes plāns: ar EXPLAIN pirms vaicājuma. http://dev.mysql.com/doc/refman/5.0/en/using-explain.html Quote Link to comment Share on other sites More sharing options...
Joyride Posted August 19, 2010 Author Report Share Posted August 19, 2010 EXPLAIN EXTENDED: id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra 1 SIMPLE wppnol index (NULL) PRIMARY 4 (NULL) 50 79498.00 where; temporary; filesort 1 SIMPLE wpp eq_ref PRIMARY PRIMARY 4 wppnol.BillID 1 100.00 1 SIMPLE customers eq_ref PRIMARY PRIMARY 4 wpp.CustID 1 100.00 1 SIMPLE services eq_ref PRIMARY PRIMARY 4 wpp.ServID 1 100.00 1 SIMPLE employees eq_ref PRIMARY PRIMARY 4 wppnol.PrintedBy 1 100.00 1 SIMPLE wpstat eq_ref PRIMARY PRIMARY 4 wpp.Status 1 100.00 1 SIMPLE bills eq_ref PRIMARY PRIMARY 4 wpp.BillID 1 100.00 1 SIMPLE wppnol_data ref wpn_id wpn_id 4 wppnol.ID 1 100.00 1 SIMPLE warehouses eq_ref PRIMARY PRIMARY 4 wppnol_data.warehouse_id 1 100.00 WHERE: wppnol.delby = '0' GROUP BY: wppnol.ID ORDER BY: wppnol.starttime DESC Quote Link to comment Share on other sites More sharing options...
codez Posted August 19, 2010 Report Share Posted August 19, 2010 pamēģini uztaisīt wppnol tabulai indeksu tieši šādā secībā - delby,id,starttime Quote Link to comment Share on other sites More sharing options...
Maris-S Posted August 19, 2010 Report Share Posted August 19, 2010 (edited) Tāda aizdoma, ka varētu kādu rezultātu panākt, uzliekot indeksu uz wppnol.delby. Edited August 19, 2010 by Maris-S Quote Link to comment Share on other sites More sharing options...
Joyride Posted August 19, 2010 Author Report Share Posted August 19, 2010 Izmēģināju, diemžēl nekas nemainās laika ziņā. Pagaidām atrisinājām problēmu, atlasot tikai pēdējos 5000 (aptuveni) galvenās tabulas ierakstus. Sākumā {ID} = MAX(id) - 5000 un tad "smagajā" vaicājumā WHERE id > {ID}. Ja ir ieslēgti atsevišķi filtri, tad šis jaunais kritērijs netiek piemērots (piem., meklēšana pēc laikiem vai kaut kādu dokumentu numuriem). Rezultātā vaicājums izpildās 0.7 sec. Nav jau perfekts risinājums, tā kā, ja kādam ir vēl kādas idejas, labprāt uzklausītu! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.