/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL og en tilfældig select
Fra : Morten Guldager


Dato : 17-05-04 22:20

Hejsa,

Til noget stikprøve kontrol har jeg brug for at plukke en
tilfældig række fra en tabel i mysql.

Jeg prøvede med:

select * from big_mother_fucker order by rand() limit 1;

Det virker men koster en 100 års full table scan. (eller
ihvertfald alt for lang tid, og alt for meget disk IO + CPU)

Bedre forslag?


/Morten

 
 
Troels Arvin (17-05-2004)
Kommentar
Fra : Troels Arvin


Dato : 17-05-04 22:44

On Mon, 17 May 2004 21:20:10 +0000, Morten Guldager wrote:

> Til noget stikprøve kontrol har jeg brug for at plukke en tilfældig
> række fra en tabel i mysql.

Hvordan er tabellens rækker identificeret? Hvis det er med en numerisk
værdi kan du måske nøjes med følgende: I din applikation genererer du
et tilfældigt tal (###), der giver mening i forhold til din tabels
identitetskolonne; hvis "SELECT * FROM tabelnavn WHERE tabelnavn_id=###"
giver et resultat er du glad, ellers bliver du ved, indtil det gør. Man
kan selvfølgelig forestille sig situationer, hvor dette vil resultere i
rigtig mange forsøg, men i nogle situationer kan det måske bruges?

Ellers så skift til et DBMS, der understøtter samplinger fra tabeller.
DB2 gør fx., uden at jeg dog ved, hvor tilfældigt det sker.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Leif (18-05-2004)
Kommentar
Fra : Leif


Dato : 18-05-04 13:54


"Morten Guldager" <spamtrap@mogul.dk> skrev i en meddelelse
news:slrncaib4a.f9q.spamtrap@linuxine.mogul.dk...
> Hejsa,
>
> Til noget stikprøve kontrol har jeg brug for at plukke en
> tilfældig række fra en tabel i mysql.
>
> Jeg prøvede med:
>
> select * from big_mother_fucker order by rand() limit 1;
>
> Det virker men koster en 100 års full table scan. (eller
> ihvertfald alt for lang tid, og alt for meget disk IO + CPU)
>
> Bedre forslag?

Lav et tilfældigt tal mellem 0 og num_rows.
brug derefter limit $tal,1 til at hente en record.

Leif
>
>
> /Morten



Morten Guldager (18-05-2004)
Kommentar
Fra : Morten Guldager


Dato : 18-05-04 18:06

Tue, 18 May 2004 at 12:54 GMT Leif wrote
>
> "Morten Guldager" <spamtrap@mogul.dk> skrev i en meddelelse
> news:slrncaib4a.f9q.spamtrap@linuxine.mogul.dk...
>> Hejsa,
>>
>> Til noget stikprøve kontrol har jeg brug for at plukke en
>> tilfældig række fra en tabel i mysql.
>>
>> Jeg prøvede med:
>>
>> select * from big_mother_fucker order by rand() limit 1;
>>
>> Det virker men koster en 100 års full table scan. (eller
>> ihvertfald alt for lang tid, og alt for meget disk IO + CPU)
>>
>> Bedre forslag?
>
> Lav et tilfældigt tal mellem 0 og num_rows.
> brug derefter limit $tal,1 til at hente en record.

Ok, jeg tror nok jeg har fanget den overordnede ide, men der er
et par ting jeg ikke forstår ved dit løsningsforslag.
- num_rows, hvad er det for en fætter? Så vidt jeg kan se er det
ikke en intern MySQL funktion.
- explain siger at jeg stadig kommer igennem en full table scan.

Det er dog stadig hurtigere at plukke den sidste række med limit
end det er at udføre sort by rand() tingen. Det er muligvis udelukkende
en CPU flaskehals jeg har. Ikke at det ændrer ret meget.


/Morten

Leif (18-05-2004)
Kommentar
Fra : Leif


Dato : 18-05-04 19:58


"Morten Guldager" <spamtrap@mogul.dk> skrev i en meddelelse
news:slrncakgjk.lnf.spamtrap@linuxine.mogul.dk...
> Tue, 18 May 2004 at 12:54 GMT Leif wrote
> >
> > "Morten Guldager" <spamtrap@mogul.dk> skrev i en meddelelse
> > news:slrncaib4a.f9q.spamtrap@linuxine.mogul.dk...
> >> Hejsa,
> >>
> >> Til noget stikprøve kontrol har jeg brug for at plukke en
> >> tilfældig række fra en tabel i mysql.
> >>
> >> Jeg prøvede med:
> >>
> >> select * from big_mother_fucker order by rand() limit 1;
> >>
> >> Det virker men koster en 100 års full table scan. (eller
> >> ihvertfald alt for lang tid, og alt for meget disk IO + CPU)
> >>
> >> Bedre forslag?
> >
> > Lav et tilfældigt tal mellem 0 og num_rows.
> > brug derefter limit $tal,1 til at hente en record.
>
> Ok, jeg tror nok jeg har fanget den overordnede ide, men der er
> et par ting jeg ikke forstår ved dit løsningsforslag.
> - num_rows, hvad er det for en fætter? Så vidt jeg kan se er det
> ikke en intern MySQL funktion.

Nej, jeg tænker på php.

> - explain siger at jeg stadig kommer igennem en full table scan.
>
Hvis du ikke laver en order by, burde den vel ikke lave en full table scan?
Eller en full table scan, der med det samme hopper til række 24345 tager vel
ikke kraft.

> Det er dog stadig hurtigere at plukke den sidste række med limit
> end det er at udføre sort by rand() tingen.

Som sagt, lav ikke en sort by. Eller sort evt by et indexeret felt.

Leif



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste