Jump to content
php.lv forumi

Lēns it kā vienkāršs SQL vaicājums


Joyride

Recommended Posts

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?

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...