webForumDet fria alternativet
Logga in / Bli medlem

Knas med select

Databaser & SQL

7 svar · 261 visningar · startad av K@llen

Medlem sedan mars 20032 667 inlägg
Trådstart#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?

Medlem 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
Medlem 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?

Medlem 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.

Medlem 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

Medlem 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.)

Medlem 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?

Medlem sedan mars 20032 667 inlägg
#8

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

261 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)