Jump to content
php.lv forumi

Lēns query's sanācis


Recommended Posts

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

nvenadkwdp9uo4y702ec.png

Edited by Wuu
Link to post
Share on other sites

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.

Link to post
Share on other sites

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 by Wuu
Link to post
Share on other sites

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 by jurchiks
Link to post
Share on other sites

Šā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.

Link to post
Share on other sites

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.

Link to post
Share on other sites

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.

Link to post
Share on other sites

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`
Link to post
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...