Wuu Posted November 9, 2014 Report Share Posted November 9, 2014 (edited) select t1.tid,t1.title,FROM_UNIXTIME(t1.start_date, "%Y.%m.%d") as start_date,t1.starter_name,t2.post,t1.starter_id,count(t3.link) as coments,"news" as array_name from '.$INFO['sql_tbl_prefix'].'topics t1 left join '.$INFO['sql_tbl_prefix'].'posts t2 on (t1.tid = t2.topic_id) left join comments t3 on (t1.tid = t3.link) where t1.forum_id = 44 group by t1.tid order by t1.start_date desc limit 10; Pēc tabulas "comments" updeita, šis query pildās 10 sekundes. Var kāds izskaidrot kur sāls? Tabulā ir kādi 11k ierakstu, smieklīgi. Tabula comments Edited November 9, 2014 by Wuu Quote Link to comment Share on other sites More sharing options...
gurkjis Posted November 9, 2014 Report Share Posted November 9, 2014 1. indeksi ? visur, kur ir kondīciju matchs un ierakstu sets, no kura izlasīt, ir paliels: 1.1 "....posts t2 on (t1.tid = t2.topic_id)" - t2.topic_id ir indekss? 1.2 "....comments t3 on (t1.tid = t3.link)" - t3.link ir indekss ? 1.3 "...where t1.forum_id" - t1.forum_id ? ja palaidīsi kveriju ar EXPLAIN keywordu priekšā, tad iegūsi precīzāku info, kas tiek darīts, varbūt vari iemest te forumā rezultātu no šī kverija. Quote Link to comment Share on other sites More sharing options...
Wuu Posted November 9, 2014 Author Report Share Posted November 9, 2014 (edited) 1.1 ir indeksi 1,2 t3.link nav indeks, imho, t3.link nav unikāls 1.3 arī nav index, imho, t1.tid jau ir index Šitās tabulas pats netaisīju... Pievienoju "where (t1.forum_id = 44 && t1.tid = t3.link)" palīdzēja, bet tik un tā 2 sekundes. Explain id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref forum_id,last_x_topics,last_post forum_id 2 const 612 Using temporary; Using filesort 1 SIMPLE t2 ref topic_id topic_id 4 uocBeta.t1.tid 7 1 SIMPLE t3 ALL NULL NULL NULL NULL 10960 Edited November 9, 2014 by Wuu Quote Link to comment Share on other sites More sharing options...
Kasspars Posted November 9, 2014 Report Share Posted November 9, 2014 Uzliec indeksu uz t3.link. Indeksa tipu liec INDEX! Vērtībā nav obligāti būt unikālām! Quote Link to comment Share on other sites More sharing options...
Wuu Posted November 9, 2014 Author Report Share Posted November 9, 2014 Kasspars, neļauj Incorrect table definition; there can be only one auto column and it must be defined as a key Jo AUTO_INCREMENT ir uz id Quote Link to comment Share on other sites More sharing options...
Kasspars Posted November 9, 2014 Report Share Posted November 9, 2014 Tu kaut ko nepareizi dari! Iedod indeksa query vai arī parādi indeksa formas screenshot, kur tu esi sadefinējis visas indeksa vērtības Quote Link to comment Share on other sites More sharing options...
e-remit Posted November 9, 2014 Report Share Posted November 9, 2014 Ātrumu varētu uzlabot, ja atmestu GROUP BY, un tās divas tabulas, kuras tu pievieno ar LEFT JOIN, atlasītu SELECT daļā kā subquery. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted November 9, 2014 Report Share Posted November 9, 2014 (edited) Tiešām tiešām neļauj? ALTER TABLE `comments` ADD INDEX (`link`); >1.3 arī nav index, imho, t1.tid jau ir index kā tas jāsaprot? Ir vai nav tur index? P.S. Vajadzētu tomēr tabulu alias rakstīt nevis t1/t2/t3, bet, piemēram, "posts p, comments c", tā daudz vieglāk lasīt kveriju. Edited November 9, 2014 by jurchiks Quote Link to comment Share on other sites More sharing options...
Kasspars Posted November 9, 2014 Report Share Posted November 9, 2014 (edited) CREATE INDEX link_idx ON comments (link) Edited November 9, 2014 by Kasspars Quote Link to comment Share on other sites More sharing options...
Wuu Posted November 9, 2014 Author Report Share Posted November 9, 2014 (edited) Paldies, Kasspars, līdz 0.2 sekundēm samazinājās :D Būs, ok, tāpat pliku html servēšu. Edited November 9, 2014 by Wuu Quote Link to comment Share on other sites More sharing options...
azpage Posted November 10, 2014 Report Share Posted November 10, 2014 Šādi vaicājumi ir jānovērš, pie 11 tūkst ierakstiem vēl ok, bet kas būs pie 1 milj.ierakstiem? 0.2sec vienam vaicājumam ir daudz. Te komentu skaitu vajadzētu glabāt pie "topics" tabulas, tā izdosies tikt vaļā no Group BY daļas. Kādēļ vajag "posts" tabulu siet klāt? To "post" lauku varbūt pat labāk atsevišķā vaicājumā nolasīt. Quote Link to comment Share on other sites More sharing options...
e-remit Posted November 10, 2014 Report Share Posted November 10, 2014 Te komentu skaitu vajadzētu glabāt pie "topics" tabulas, tā izdosies tikt vaļā no Group BY daļas. Tak tāpat tas GROUP BY ir lieks, jo no t2 un t3 pa vienam laukam tiek lasīts, līdz ar to var pa tiešo SELECT daļā ielikt šo tabulu atlasi un GROUP BY nebūs vajadzīgs. Quote Link to comment Share on other sites More sharing options...
azpage Posted November 10, 2014 Report Share Posted November 10, 2014 Tak tāpat tas GROUP BY ir lieks, jo no t2 un t3 pa vienam laukam tiek lasīts, līdz ar to var pa tiešo SELECT daļā ielikt šo tabulu atlasi un GROUP BY nebūs vajadzīgs. Nop, selectā ir COUNT funkcija. Tā vienkārši atmetot nevarēs iegūt komentāru skaitu. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted November 10, 2014 Report Share Posted November 10, 2014 Limit 10... IMHO būs ātrāk un vienkāršāk ar otru kveriju izkverijot katram jūzerim komentāru skaitu. Quote Link to comment Share on other sites More sharing options...
e-remit Posted November 10, 2014 Report Share Posted November 10, 2014 Nop, selectā ir COUNT funkcija. Tā vienkārši atmetot nevarēs iegūt komentāru skaitu. Kāpēc lai nevarētu COUNT izmantot? Idejiski: SELECT t1.id, ( SELECT COUNT(*) t2_count FROM t2 WHERE t2.t1_id = t1.id ) some_count FROM t1 ORDER BY t1.`order` 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.