webForumDet fria alternativet

optimering av denna kod

15 svar · 381 visningar · startad av ampy

ampyMedlem sedan feb. 20011 498 inlägg
#1
	sql = "select fp.id_trad, fp.user_id, fp.datum, ft.subject, ft.rum, m.username, fp.id, ft.svar " & _
	"From forum_posts fp inner join forum_topics ft on fp.id_trad = ft.id_trad " & _
	"left outer join members m on fp.user_id = m.id " & _
	"where ft.rum = 2 " & _
	"order by fp.datum desc"

	set rs = connect.execute(sql)

	if not rs.eof then

		response.write 	"<font color='#000000'>" & _
				"<a title='"&rs(3)&"' href='showthread.asp?id="&rs(0)&"'>"
	
		subject = rs(3)
			if len(subject) > 18 then
				subject = left(subject,18)&"..."
				end if
											
		response.write 	server.htmlencode(subject) & _
				"</a>" & _
				"<br><b>Av:</b> <a href='krypin.asp?id="&rs(1)&"'>"&rs(5)&"</a>" & _
				"<br><b><font color='#FF0000'>"&changetime(rs(2))&"</font>" & _
				"</b></font>"

		last_id = rs(6)
		thread_id = rs(0)
		thread_rum = rs(4)	
		antalsvar = rs(7)

	else
		response.write "<center><b>Aldrig</b></center>"
	end if

	set rs = nothing

Denna kod tar 0,3 sekunder att utföra vilket jag tycker är ganska mycket på en server som har 2,2 MHz och 512 MB i minne.

Så hur ska man kunna göra så att denna kod körs snabbare?
Några tips?

Jag har skapat index för de flesta kolumner.
Databas är MySQL.

PeeerMedlem sedan mars 20025 907 inlägg
#2

Re: optimering av denna kod

ampy skrev:

Denna kod tar 0,3 sekunder att utföra vilket jag tycker är ganska mycket på en server som har 2,2 MHz och 512 MB i minne.

:OO ;)

Nä, men allvarlig. Man brukar ju höra att GetRows är bra prestandamässigt. Kanske skulle ta en titt på det?

ampyMedlem sedan feb. 20011 498 inlägg
#3

Hehe, råkade skriva fel! :e

Ska testa med getrows.

ampyMedlem sedan feb. 20011 498 inlägg
#4

Testade nu med getrows och det tar ju ännu längre tid. Får 0,375 sek.

	sql = "select fp.id_trad, fp.user_id, fp.datum, ft.subject, ft.rum, m.username, fp.id, ft.svar " & _
	"From forum_posts fp inner join forum_topics ft on fp.id_trad = ft.id_trad " & _
	"left outer join members m on fp.user_id = m.id " & _
	"where ft.rum = 2 " & _
	"order by fp.datum desc"

	set rs = connect.execute(sql)

		if not rs.eof then
			strDatat = rs.getrows()
			Datat = 1
		end if

	set rs = nothing

		if Datat = 1 then

			response.write 	"<font color='#000000'>" & _
					"<a title='"&strDatat(3,0)&"' href='showthread.asp?id="&strDatat(0,0)&"'>"
	
			subject = strDatat(3,0)
				if len(subject) > 18 then
					subject = left(subject,18)&"..."
				end if
											
			response.write 	server.htmlencode(subject) & _
					"</a>" & _
					"<br><b>Av:</b> <a href='krypin.asp?id="&strDatat(1,0)&"'>"&strDatat(5,0)&"</a>" & _
					"<br><b><font color='#FF0000'>"&changetime(strDatat(2,0))&"</font>" & _
					"</b></font>"

			last_id = strDatat(6,0)
			thread_id = strDatat(0,0)
			thread_rum = strDatat(4,0)	
			antalsvar = strDatat(7,0)

		else
			response.write "<center><b>Aldrig</b></center>"
		end if
PeeerMedlem sedan mars 20025 907 inlägg
#5
set rs = connect.execute(sql)

		if not rs.eof then
			strDatat = rs.getrows()
			Datat = 1
		end if
	[b]connect.close[/b]
	set rs = nothing

Vet inte om det hjälper, men prova vet ja!

ampyMedlem sedan feb. 20011 498 inlägg
#6

Det hjälper inte.

PaceMedlem sedan juni 20019 024 inlägg
#7

Optimera din SQL-fråga istället.

Kör med EXPLAIN-syntaxen (MySQL) för att läsa av om alla index är satta i "join-skarvarna" så att säga.

BrimbaMedlem sedan dec. 19995 875 inlägg
#8

Jag har skapat index för de flesta kolumner.

Det är ju inte så bra.
Nu har jag inte arbetat med index i mySql, så jag vet inte hur det fungerar, men i SQLServer så beror det lite på om du väljer klustrat eller oklustrat index, och om du endast har unika poster i någon kolumn osv, men generellt sätt är det bra att indexera de kolumner som du ofta ställer WHERE-frågor mot.

LarsGMedlem sedan dec. 200012 464 inlägg
#9

Varför har du en outer join mellan members och forumposts?

Om du har inlägg av icke medlemmar så kan du skapa en medlem som heter Gäst så kan du använda en vanlig join istället.

ampyMedlem sedan feb. 20011 498 inlägg
#10

Det går bra med en vanlig inner join också, vet inte varför jag skapade det på en gång.

Men koden tar fortfarande 0,375 sekunder att köra.

Det där med EXPLAIN-syntaxen fattade jag ingenting av. :(

LarsGMedlem sedan dec. 200012 464 inlägg
#11

Du bör ha index på alla kolumner som du använder i join-villkoren. Om du tjänar på att ha index på rum beror på hur data är fördelat. Om nästan alla poster har värdet 2 i den kolumnen så hjälper ett index inte mycket.

ampyMedlem sedan feb. 20011 498 inlägg
#12

Kan någon förklara för mig vad EXPLAIN-syntaxen gör?

Fattade inte riktigt på MySQL's dokumentation.

ampyMedlem sedan feb. 20011 498 inlägg
#13

Märkte precis att:

order by fp.datum desc

Tar upp knappt två tiondelar.
Jag har indexerat kolumen datum men kan man inte få ner det på ett annat sätt?

LarsGMedlem sedan dec. 200012 464 inlägg
#14

Har det någon betydelse för prestandan om du gör

order by fp.datum asc
crisse6Medlem sedan dec. 20002 526 inlägg
#15

har du Dimmat da?

ampyMedlem sedan feb. 20011 498 inlägg
#16

LarsG: Nej.
crisse6: Ja.

Jag gjorde om sql-astsen så att den ser ut så här:

	sql = "select fp.id_trad, fp.user_id, fp.datum, ft.subject, ft.rum, m.username, fp.id, ft.svar " & _
	"From forum_topics ft inner join forum_posts fp on ft.id_trad = fp.id_trad " & _
	"inner join members m on fp.user_id = m.id " & _
	"where ft.rum = 2 " & _
	"order by ft.senasteinlagg desc, fp.datum desc"

Och då fick jag ner det till 2 tiondelar.

139 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)