webForumDet fria alternativet

Knas med select

7 svar · 261 visningar · startad av K@llen

K@llenMedlem sedan mars 20032 667 inlägg
#1
SELECT fp.messageTime, fp.messageUid, fp.topicId, p.req_Username  
FROM forum_post fp 
INNER JOIN forum_topic ft 
ON fp.topicId = ft.topicId 
INNER JOIN Profil p 
ON fp.messageUid = p.AnvId 
WHERE ft.forumId = 11 
ORDER BY fp.messageId DESC 
LIMIT 1

mySQL skrev:

The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok

Jag ser inget fel och fattar mig inte på felmeddelandet även om jag förstår vad där står. Någon som fattar vad felet kan vara?

K@llenMedlem sedan mars 20032 667 inlägg
#2

Lyckades nog lösa det själv. :D

		       
SELECT fp.messageTime, fp.messageUid, fp.topicId, p.req_Username, max(fp.messageId) AS latest  
FROM forum_topic ft
INNER JOIN forum_post fp 
ON ft.topicId = fp.topicId 
INNER JOIN Profil p 
ON fp.messageUid = p.AnvId  
WHERE ft.forumId = 11
GROUP BY fp.messageTime, fp.messageUid, fp.topicId, p.req_Username
ORDER BY latest DESC
LIMIT 1
K@llenMedlem sedan mars 20032 667 inlägg
#3

Nu när jag börjat använda denna sql-fråga skarpt märker jag att den är ganska seg att köra. Finns det något sätt att skriva denna fråga effektivare?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Det är nog mer intressant att se vilka index som finns och vad resultatet av explain säger.

K@llenMedlem sedan mars 20032 667 inlägg
#5

Okey, here we go... :)

Index
forum_post
Keyname | Unique | Field
PRIMARY | Yes | messageId
topicId | No | topicId
messageUid | No | messageUid

forum_topic
Keyname | Unique | Field
PRIMARY | Yes | id
id | No | id
topicId | No | topicId
forumId | No | forumId

Profil
AnvId

Och resultatet från explain:
http://member.webforum.nu/K%40llen/mysqldump.gif

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Det kanske är bäst att dela upp detta i två delar då det verkar bli lite suspekt optimering.

select max(fp.messageid)
from forum_post fp join forum_topic ft 
ON ft.topicId = fp.topicId
WHERE ft.forumId = 11
select fp.messageTime, fp.messageUid, fp.topicId, p.req_Username  
FROM forum_post fp INNER JOIN Profil p 
ON fp.messageUid = p.AnvId  
where fp.messageid = <maxfpmessageid>

(Egentligen skulle man lägga den första frågan som en subselect.)

K@llenMedlem sedan mars 20032 667 inlägg
#7

Jo, så kan man ju göra. :) Ibland blir det nog effektivare med två frågor. Vad menar du med suspekt optimering?

K@llenMedlem sedan mars 20032 667 inlägg
#8

Det verkar vara snabbare med två frågor i detta fallet, tack LarsG! :)

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