sql >> Database teknologi >  >> RDS >> Mysql

Hvordan fungerer MySQL's ORDER BY RAND()?

Selvom der ikke er sådan noget som en "hurtig ordre med rand()", er der en løsning til din specifikke opgave.

For at få en enkelt tilfældig række , du kan gøre som denne tyske blogger gør:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- case-studie-of-alternatives/ (Jeg kunne ikke se en hotlink-url. Hvis nogen ser en, er du velkommen til at redigere linket.)

Teksten er på tysk, men SQL-koden er et stykke nede på siden og i store hvide felter, så det er ikke svært at se.

Grundlæggende er det, han gør, at lave en procedure, der gør jobbet med at få en gyldig række. Det genererer et tilfældigt tal mellem 0 og max_id, prøv at hente en række, og hvis den ikke findes, så fortsæt indtil du rammer en der gør. Han giver mulighed for at hente x antal tilfældige rækker ved at gemme dem i en midlertidig tabel, så du kan sandsynligvis omskrive proceduren til at være en smule hurtigere og kun hente én række.

Ulempen ved dette er, at hvis du sletter MANGE rækker, og der er store huller, er chancerne store for, at det går glip af tonsvis af gange, hvilket gør det ineffektivt.

Opdatering:Forskellige udførelsestider

Det kan have at gøre med indeksering. id er indekseret og hurtig at få adgang til, mens tilføjelse af username til resultatet betyder, at den skal læse det fra hver række og lægge det i hukommelsestabellen. Med * den skal også læse alt ind i hukommelsen, men den behøver ikke at springe rundt i datafilen, hvilket betyder, at der ikke er nogen tabt tid på at søge.

Dette gør kun en forskel, hvis der er kolonner med variabel længde (varchar/tekst), hvilket betyder, at den skal kontrollere længden og derefter springe den længde over, i modsætning til blot at springe en fastsat længde (eller 0) over mellem hver række.



  1. Sådan får du *alt* tilbage fra en lagret procedure ved hjælp af JDBC

  2. Docker Compose og Postgres :Navn løses ikke

  3. Ajax-formular Send med indsend-knap

  4. Hvordan tæller man det samme felt to gange baseret på en boolean?