Joyride Posted August 19, 2010 Report 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
Maris-S Posted August 19, 2010 Report Posted August 19, 2010 Kas konkrēti ir pēc where, group by un order by? Quote
Aleksejs Posted August 19, 2010 Report 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
Joyride Posted August 19, 2010 Author Report 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
codez Posted August 19, 2010 Report Posted August 19, 2010 pamēģini uztaisīt wppnol tabulai indeksu tieši šādā secībā - delby,id,starttime Quote
Maris-S Posted August 19, 2010 Report 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
Joyride Posted August 19, 2010 Author Report 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
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.