webForumDet fria alternativet

Snabba upp "order by rand()"?

5 svar · 251 visningar · startad av Peeer

PeeerMedlem sedan mars 20025 907 inlägg
#1

Fråga 1: Har en sql-fråga som bl.a. gör en fritextsökning i en väldigt stor tabell, men eftersom frågan begränsas av limit 0,99 så får jag bara ut de 100 första träffarna. Så långt är det inga problem, men jag skulle gärna vilja att de 100 raderna slumpas fram. Lägger jag till order by rand() så tar dock frågan år att exekvera (för att den måste göra fritextsökningen på hela tabellen?), går det att snabba upp det här på något sätt?

Fråga 2 (om Fråga 1 inte går att lösa): Om jag istället väljer att plocka ut de 1000 första träffarna och vill lagra dem i en temporär tabell (för att sedan slumpa bland träffarna i den tabellen), hur gör jag då?

Tpf!

/r MySQL 4.0.18

pimmeMedlem sedan sep. 20011 086 inlägg
#2
  1. vet jag inte hur man gör men 2) borde bara vara att göra nåt sånt här, skapa en temporär tabell (CREATE TEMPORARY TABLE ...) och sen använda http://dev.mysql.com/doc/mysql/en/insert-select.html
PeeerMedlem sedan mars 20025 907 inlägg
#3

Mjo, det ser ju onekligen rätt rätt ut :)

Upptäckte dock att jag får problem ändå. På alternativ 2 hade jag tänkt mig att köra order by dateline (timestamp) och sen spara i temptabellen. Men oavsett vad jag sorterar resultatet på så måste tydligen hela fritextsökningen genomföras innan man kan få något resultat från frågan.

I dagsläget ser frågan ur såhär (i princip):

SELECT p.txt, p.dateline
FROM pi, p
WHERE p.colid != 143 
AND pi.srv = 43
AND pi.pid = 462
AND pi.pid = p.pid AND 
p.txt LIKE '%söksträng%')
LIMIT 0 , 1000

Tabellen ligger ordnad i datumordning, jag vill ha ut de 1000 sista raderna som uppfyller mina villkor. Borde inte det gå att göra på något smidigt sätt (typ limit -1, 1000)!?

pimmeMedlem sedan sep. 20011 086 inlägg
#4

Om du vill ha ut de 1000 sista så får du sortera i omvänd ordning (ORDER BY dateline DESC).
Sen så är det så att datan i tabellen inte ligger ordnad i någon speciell ordning (ofta sparar den datan nog i ordningen den lades till) utan den sorteras först vid en SELECT.

Ett alternativ till LIKE är att du använder fulltextsökning http://dev.mysql.com/doc/mysql/en/fulltext-search.html istället som är betydligt snabbare.

PeeerMedlem sedan mars 20025 907 inlägg
#5

pimme skrev:

Om du vill ha ut de 1000 sista så får du sortera i omvänd ordning (ORDER BY dateline DESC).

Jo det är jag medveten om. Problemet är såfort jag väljer att sortera (i början av tråden trodde jag det bara gällde när jag sorterade efter rand(), men det gäller för vad jag än sorterar på) så tar frågan alldeles för lång tid att exekvera. Det var därför jag tänkte att det kanske fanns något sätt att använda like för att räkna bakifrån istället (som ex. substr() i php). Visst, man ska inte lita på att datan alltid ligger i den ordning som man lagt till den, men det är tillräckligt säkert för min applikation

Ett alternativ till LIKE är att du använder fulltextsökning http://dev.mysql.com/doc/mysql/en/fulltext-search.html istället som är betydligt snabbare.

Ska kolla på det, dock väldigt osäker på om jag kan/får förändra något i databasen (såsom att lägga till ett extra index).

PeeerMedlem sedan mars 20025 907 inlägg
#6

Ok, dagens tabbe. Joinar ett antal tabeller i den riktiga frågan. Jag hade helt enkelt missat att skapa en relation till en av tabellerna. Nu går det fint att sortera hur jag vill. :)

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