Search the Community
Showing results for tags 'performance'.
-
Labvakar, izdomāju uzrakstīt, varbūt pametīsiet kādu ideju. Doma tāda. Mysql tabula, kurā krīt iekšā statistikas dati. Value, filter kolonnas šajā gadījumā nav vajadzīgas, jo tiks izmantotas citur. Tabulas struktūra un testa dati. Reālajā vidē tie būs daudz, daudz vairāk un sāksies problēmas ar summēšanu, tāpēc arī ir šis topiks. SQL zemāk spoiler tagos: Selects no testa tabulas. SELECT person_id, coalesce(sum(case when stats_id = 1 then skaits end), 0) as s1, coalesce(sum(case when stats_id = 2 then skaits end), 0) as s2, coalesce(sum(case when stats_id = 3 then skaits end), 0) as s3, coalesce(sum(case when stats_id = 4 then skaits end), 0) as s4 FROM ( SELECT person_id, stats_id, COUNT(*) as skaits FROM testa_tabula GROUP BY person_id, stats_id ORDER BY skaits DESC ) AS X GROUP BY person_id Rezultāts vizuāli: Meklēts tiek stats_id skaits sagrupēts pēc personas id. Ar iespēju pēc tam sortēt pēc katras s1, s2, s3, s4... kolonnas, vienlaicīgi redzot pārējos datus. Stats_id ar laiku palielināsies, bet ne bezgalīgi. Kverija explain: Uz puslīdz reāliem datiem, 90% kverija aizņem copying to tmp table, jo jāsasummē ir diezgan daudz, salīdzinot ar iegūstamo rezultātu. Ieteikumi? Šo te kveriju ir iespējams uzlabot? Vai taisīt kaut kādu starptabulu ar jau sasummētiem datiem? Joks tāds, ka esošo rezultātu kādreiz būs nepieciešams vēl arī filtrēt pēc citām kolonnām - filter1, filter2. Tāpēc vienīgais variants ir sasummēt grupējot pēc person_id, stats_id, filter1, filter2, kā rezultātā ierakstu skaits nemaz tik ļoti nesamazināsies. //update: Ar starptabulu sanāk daudz maz normāli, ja ignorē filter1 un filter2. explain rezultāts: type=index, rows=81, extra=using where