Avatar billede eksperten1 Nybegynder
02. februar 2003 - 23:17 Der er 21 kommentarer og
1 løsning

RAND() = Slow ??

I et select fra en tabel med små 600.000 rækker bruger jeg rand() for at hente 20 tilfældige.
Problemet er bare at det tager ca. 50 sekunder og det er sgu for langsomt. Hvis jeg istedet ORDER BY navn så tager det 10 sek.

Der er omtrent 50.000 records der matcher.

Her er min sql
SELECT navn, adresse, postnr, bynavn, email, web, telefon, telefax, kode1, kode2 FROM kobdata2 WHERE MATCH(kat1, kat2, kat3, kat4, kat5, kat6, kat7, kat8, kat9) AGAINST ('Anden landtransport Anden transportformidling Landtransport rørtransport Rørtransport Vejgodstransport') ORDER BY RAND() LIMIT 20

Hvad kan jeg gøre.
Avatar billede erikjacobsen Ekspert
02. februar 2003 - 23:18 #1
Ja, det tager lang tid. Skal det være 20 supertilfældige billeder hver gang?
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 23:23 #2
I manualen til MySQL på

http://www.mysql.com/doc/en/Mathematical_functions.html

står der:

"You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. In MySQL Version 3.23, you can, however, do: SELECT * FROM table_name ORDER BY RAND() This is useful to get a random sample of a set SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000."
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 23:29 #3
Jeg foreslår at du benytter en pesudo-random-funktion. Hvis din tabel har et id-felt som indeholder en primær-nøgle, som er af typen heltal:

SELECT id, navn, adresse, postnr, bynavn, email, web, telefon, telefax, kode1, kode2 FROM kobdata2 WHERE MATCH(kat1, kat2, kat3, kat4, kat5, kat6, kat7, kat8, kat9) AGAINST ('Anden landtransport Anden transportformidling Landtransport rørtransport Rørtransport Vejgodstransport') ORDER BY MOD(id * <et tilfældigt heltal> * 10000001, 100001) LIMIT 20
Avatar billede erikjacobsen Ekspert
02. februar 2003 - 23:33 #4
Det vil ikke gøre den store forskel, darkstar. Alene udvælgelsen
af de 50.000 relevante rækker tager tid. Mit forslag ville være
et cron-job, der en gang om dagen eller en gang i timen
udvælger ca. 1000 id-er med rand() - gemmer disse i en fil
eller tabel. Og så udvælges de 20 derfra. Ikke supertilfældigt,
men la'siggørligt
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 23:45 #5
erik>> Læs mysqls manual-side. Det er *væsentligt* langsommere at bruge rand()-funktionen.

Jeg er godt klar over at det stadigvæk bliver forfærdeligt langsomt, men lad os da se hvor det bærer hen...
Avatar billede eksperten1 Nybegynder
02. februar 2003 - 23:45 #6
Det var da noget værre l*rt. Det kan være at jeg må droppe den rand() funktion, men det ødelægger deværre løsningen lidt.
Avatar billede eksperten1 Nybegynder
02. februar 2003 - 23:45 #7
erik smider du også et svar, så kan jeg lukke.
mvh
Mark
Avatar billede eksperten1 Nybegynder
02. februar 2003 - 23:48 #8
>darkstar, jeg tror ikke helt at jeg fik fat i den.
ORDER BY MOD(id * ?random funktion her? * 10000001, 1000001) LIMIT 20

Og hvordan laver jeg det tilfældige hel tal ?

1000tak
Mark
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 23:48 #9
Du har en tabel hvor du "finder" 50.000 ud af 60.000 mulige rækker og kaster lidt rundt med rækkerne i resultatet.

Uanset hvad du gør, så er det at lege med ilden. Det skulle jeg måske have skrevet ovenfor.
Avatar billede erikjacobsen Ekspert
02. februar 2003 - 23:49 #10
Ingen point til mig (ellers forlænger de bare mit gratis PRO-abonnement)

De 10 sekunder er nok minimum for udvælgelsen alene, og det er i
sig selv uacceptabelt.

"ødelægger løsningen" ?? Hvorfor kan du ikke gøre som jeg foreslår?
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 23:49 #11
Det tilfældige tal skal du lave i det program (eller script), som kalder databasen. Du skal generere et nyt tal hver gang du foretager kaldet.
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 23:51 #12
Jeg tror også at du skal være klar til at smide min løsning og hoppe på Eriks forslag. Prøv det alligevel - det tager 5 sekunder.
Avatar billede eksperten1 Nybegynder
02. februar 2003 - 23:53 #13
>erikc - Dit udemærkede forslag har jeg ikke tid til at implementere, løsningen skulle afleveres imorgen og det er først idag at jeg dinder ud af at enkelte søgninger tager så lang tid. Nu skal jeg bare finde ud af en omvej. Det var ikke for at være utaknemmelig!;)

>darkstar, tja nu må jeg jo indrømme at jeg ikk eved hvordan jeg skal lave et tilfældigt heltal i ASP. (pinligt)
Avatar billede _darkstar_ Nybegynder
02. februar 2003 - 23:59 #14
Det ved jeg heller ikke.

Forslag:

1) Kig på msdn.microsoft.com og find random-funktionen (for selvfølgelig er den der).
2) Tag nogle forskellige tal, f. eks. klokkeslettet i sekunder og de sidste cifre i browserens IP-nummer og lav dem til æblegrød (noget med at gange og tage modulo bagefter).
Avatar billede erikjacobsen Ekspert
02. februar 2003 - 23:59 #15
Natten er endnu ung :) Men ok, bare ideen er go' nok.
Avatar billede erikjacobsen Ekspert
03. februar 2003 - 00:00 #16
ASP? Der er noget, der hedder RAND() også dér.
Avatar billede eksperten1 Nybegynder
03. februar 2003 - 00:02 #17
>erik :)) Ja JA Ja, men mon ikke også at det nok skal blive lyst før end jeg ser dyner....

Jeg kigger på Rand() hos msdn eller i en bog bag ved mig... Øjeblik.
Avatar billede eksperten1 Nybegynder
03. februar 2003 - 00:16 #18
>darkstar. Tja det halverede ca tiden havner omtrent de 30 sekunder. Det er desværre alt for langsomt, så jeg er nødt til at finde på en anden løsning. Jeg kommer nok til at undlade den rand() funktion hvis det er en søgning i denne størrelse.

Jeg takker mange gange for jeres indsats.
Og Erik, du slipper :)
Avatar billede _darkstar_ Nybegynder
03. februar 2003 - 09:19 #19
eksperten1>>> Brug Eriks løsning.

Jeg håber at du har nået det.
Avatar billede eksperten1 Nybegynder
03. februar 2003 - 09:26 #20
Jeg måtte ændre det sådan at hvis en bruger vælger mere end 3 kategorier, så sorteres der efter navn. Det drejer sig om ca. 4 ud af 2000 kategorier som brugeren kan søge i, så det går lige an.

Tak, da den var 2:30 så det hele fornuftigt ud og jeg gik i hi:)
Avatar billede _darkstar_ Nybegynder
03. februar 2003 - 09:33 #21
Fint.
Avatar billede eksperten1 Nybegynder
03. februar 2003 - 09:46 #22
Nej det syntes jeg egentligt ikke, men det var hvad det kunne blive til inden for det begrænsede tidsrum. (og økonomi!)

Men I skal have mange tak for hjælpen, det er fantastisk at kunne få så hurtig hjælp af dygtige mennesker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester