webForumDet fria alternativet

Optimera slö fråga med många left joins

Databaser & SQL

2 svar · 307 visningar · startad av Pace

Medlem sedan juni 20019 024 inlägg
Frågan#1

Denna frågan är ganska snabb så länge det är få poster, men jag vill att den ska vara snabb även om det är många. Det tar upp emot en sekund vid ca 700 poster, och det är den tredje joinen (paceboard_attachments) som ställer till det - tar jag bort den går det snabbare. Finns det något sätt att optimera frågan och/eller ändra i strukturen?

SELECT
P_PostID, P_AuthorID, user.M_Username, user.M_UserTitle,
user.M_Posts, user.M_Town, editedby.M_Username, P_LastEditedDate, P_PostDate, P_MsgIcon,
P_IncludeSignature, P_IPAddress, attachment.Filename, attachment.Fileextension,
attachment.Filesize, attachment.Counter, attachment.visible, online.UserID,
user.M_Signature, P_Message

FROM paceboard_posts
LEFT JOIN paceboard_members editedby ON P_LastEditedBy = editedby.M_MemberID
LEFT JOIN paceboard_members user ON P_AuthorID = user.M_MemberID
LEFT JOIN paceboard_attachments AS attachment ON attachment.ID = paceboard_posts.P_AttachmentID
LEFT JOIN paceboard_online AS online ON online.UserID = user.M_Username

WHERE P_TopicID = 2
ORDER BY P_PostDate ASC
Medlem sedan juli 2002145 inlägg
#2

Tja, det är inte lätt att veta... Men man kan ju alltid testa några olika varianter. Olika syntaxer kostar olika mycket prestanda i olika databashanterare. Det är inte så dumt att ha ett verktyg som kan visa frågans Query Plan - då ser man direkt om den evalueras på något konstigt sätt.

Du kanske till exempel inte behöver LEFT JOIN i alla kopplingar? Author och LastEditedBy låter för mig som uppgifter som alltid finns!? Då kan du ju byta ut LEFT JOIN mot en gammal hederlig JOIN med hjälp av WHERE-villkoret.

Om just Attachment-delen slöar ner kanske det hjälper att lägga på ett sekundärt index som stöder villkoret, dvs på paceboard_posts.P_AttachmentID (för attachment.ID är väl primärnyckeln?)

Några tankar bara...

Medlem sedan juni 20019 024 inlägg
#3

Jo, jag hade kört med EXPLAIN-syntaxen (motsvarande "query plan" som du nämnde) och inte fått några konstiga värden så jag fann det ganska märkligt. Alla index är på "rätt" plats också.

Men hur som helst, jag gjorde som du sa med att använda WHERE istället för JOIN, det verkade lösa hela problemet! Gjorde det på paceboard_members-tabellen och frågan genomförs mycket snabbare nu! Tackar! :)

[b]Ändringar i rött[/b]

SELECT
P_PostID, P_AuthorID, user.M_Username, user.M_UserTitle,
user.M_Posts, user.M_Town, editedby.M_Username, P_LastEditedDate, P_PostDate, P_MsgIcon,
P_IncludeSignature, P_IPAddress, attachment.Filename, attachment.Fileextension,
attachment.Filesize, attachment.Counter, attachment.visible, online.UserID,
user.M_Signature, P_Message

FROM paceboard_posts, [red]paceboard_members AS user[/red]
LEFT JOIN paceboard_members editedby ON P_LastEditedBy = editedby.M_MemberID
LEFT JOIN paceboard_attachments AS attachment ON attachment.ID = paceboard_posts.P_AttachmentID
LEFT JOIN paceboard_online AS online ON online.UserID = user.M_Username

WHERE P_TopicID = 2 [red]AND P_AuthorID = user.M_MemberID[/red]
ORDER BY P_PostDate ASC
448 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
309 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
309 ms — ändringar (db)