UNION er for langsom

Tags:    databaser

Jeg har et forum der består af en tabel med et felt "svar".
Hvis et indlæg er nyt vil der stå "0" i svar-feltet. Hvis der bliver svaret på indlægget vil der stå ID'et på det svar som man svarer på.. egentlig såre simpelt.

Problemet er at når jeg samler oversigten med samtlige indlæg vil jeg gerne sortere dem således at de indlæg med det seneste svar står øverst. Til det formål kører jeg følgende SQL:

--------------
select id, overskrift, svar, dato, forfatter, vist from forum where svar = 0 and kategori=1 union select t1.id, t1.overskrift, t1.svar, t2.dato, t2.forfatter, t1.vist from forum t1, forum t2 where t1.id = t2.svar and t1.kategori = 1 order by dato desc
--------------

Problemet er at nu hvor der er ca. 60.000 indlæg begynder det at gå lidt langsomt.. er der nogle der har et par sql-tricks til at lave søgningen lidt hurtigere?

PS: Kender ikke så meget til pointsystemet så jeg skyder fra hoften ang. sværhedsgrad og pointfordeling.




6 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato

Uden at have testet, så noget i stil med:

SELECT dato, overskrift, (SELECT COUNT(*) FROM forum f2 WHERE f2.svarID = f1.ID AND f2.kategori = f1.kategori) FROM forum f1

Problemet er, at det vil vise en liste med alle records, inclusive svarene (ID 3+4 fra dit eksempel). Har du en mulighed for at markere de records der er starten på en ny tråd?



"union all" i stedet for "union" ?




"union all" i stedet for "union" ?


Yup, det virkede faktisk lidt. Forespørgslen faldt fra 0.79 sekund til 0.55 sekund.. Det er måske det hurtigste der kan laves?



Jeg prøver istedet på noget andet for at droppe UNION:

select id, overskrift, svarID, dato from forum order by dato desc

vil returnere følgende:

ID| overskrift | svarID | dato
-----------------------------
3 | re: foo | 1 | idag kl. 0800
4 | re: fubar | 2 | idag kl. 0900
1 | foo | 0 | igår
2 | fubar | 0 | igår
------------------------------

Men jeg vil jo gerne samle resultatet så det ender med at se således ud, sorteret med den nyeste opdaterede tråd:

Overskrift | svarID | dato
------------------------
foo | 1 | idag kl. 0800
fubar | 1 | idag kl. 0900
-------------------------

Der sikker noget super simpelt som jeg glemmer...Har en fornemmelse af at GROUP BY er svaret, men kan ikke lige få det til at virke

PS: Hvordan giver man pointene til den der svarer?







Indlæg senest redigeret d. 13.01.2007 10:46 af Bruger #11068
En anden ting du kunne gøre er, hvis du har en thread_id (unikt nr. for hver tråd) er:

SELECT thread_id, count(id) FROM forum GROUP BY thread_id



Det ser umiddelbart bedre ud.. jeg skal bare lige have fikset det så det ligner mySql mht alias.

SELECT t1.name, t2.salary FROM employee AS t1, info AS t2
WHERE t1.name = t2.name;

De var nemt nok indtil jeg nåede counten. Men mon ikke jeg hitter ud af det.

Jeg har desværre ikke nogen threadID, selvom det umiddelbart ser ud til at have været en god idé.. Jeg kan dog evt udvide databasen med dette felt lave en nøgle og løbe alle indlæggene igennem og sætte unikt ID på hver... Det vil jo lette arbejdet en del..



t