Hoe optimaliseer je de operator ORDER BY RAND()?
sobes.tech AI
Antwoord van AI
Het optimaliseren van ORDER BY RAND() is moeilijk, omdat het volledige gegevensselectie vereist om voor elke rij een willekeurig nummer te genereren. Typische benaderingen:
-
Selecteer een willekeurige ID:
- Verkrijg het aantal rijen in de tabel.
- Genereer een willekeurig getal tussen 0 en N-1 (of 1 en N).
- Selecteer de rij met de juiste offset of
OFFSET.
SELECT COUNT(*) FROM your_table; -- Aangenomen dat het totale aantal rijen = N is SELECT * FROM your_table LIMIT 1 OFFSET floor(random() * N);Deze methode is geschikt voor het selecteren van één of enkele willekeurige rijen. Niet efficiënt voor grote aantallen rijen.
-
Willekeurige selectie op basis van ID-bereik:
- Vind de minimale en maximale
id. - Genereer een willekeurig getal binnen dat bereik.
- Selecteer de rij met
id >= willekeurig_getal, metLIMIT.
SELECT MIN(id), MAX(id) FROM your_table; -- Aangenomen dat min_id, max_id zijn verkregen -- In de applicatie, genereer een willekeurige id in het bereik [min_id, max_id] -- Bijvoorbeeld: willekeurig_id = min_id + floor(random() * (max_id - min_id + 1)) SELECT * FROM your_table WHERE id >= willekeurig_id LIMIT 1;Kan rijen overslaan als er gaten in
idzijn. - Vind de minimale en maximale
-
Creëer een tijdelijke tabel of gebruik een subquery met sortering op willekeurige waarde:
- Selecteer een subset van gegevens of alleen
idin een subquery. - Pas
ORDER BY RAND()toe op deze subset.
SELECT * FROM your_table AS t1 JOIN (SELECT id FROM your_table ORDER BY RAND() LIMIT 100) AS t2 ON t1.id = t2.id;Vermindert de belasting als
LIMITop de subquery wordt toegepast. - Selecteer een subset van gegevens of alleen
-
Gebruik een extra veld met een willekeurig getal:
- Voeg een veld toe aan de tabel om een willekeurig getal op te slaan.
- Werk dit veld periodiek bij voor alle rijen.
- Sorteer op dit veld.
-- Voeg veld toe ALTER TABLE your_table ADD random_sort_key FLOAT; -- Periodieke update UPDATE your_table SET random_sort_key = RAND(); -- Selectie SELECT * FROM your_table ORDER BY random_sort_key LIMIT 10;Vereist schemawijzigingen en achtergrondupdateproces.
-
Fisher-Yates shuffling algoritme buiten de database:
- Selecteer alle
id(of alle gegevens als ze klein zijn). - Schud de lijst in de applicatie.
- Selecteer de eerste N elementen.
// Aangenomen dat ids []int is // ids = ... // Verkrijg ids uit de database rand.Shuffle(len(ids), func(i, j int) { ids[i], ids[j] = ids[j], ids[i] }) // Nu zijn de eerste N elementen van ids willekeurig // Gebruik ze om volledige rijen te selecteren // SELECT * FROM your_table WHERE id IN (...)Alleen geschikt voor tabellen met een klein aantal rijen.
- Selecteer alle
De keuze van de optimale methode hangt af van de grootte van de tabel, het benodigde aantal willekeurige rijen en het specifieke databasesysteem. Voor de meeste gevallen, wanneer een klein aantal willekeurige rijen uit een grote tabel moet worden geselecteerd, is de combinatie van het verkrijgen van id en vervolgens OFFSET of WHERE id IN (...) efficiënter dan direct sorteren op RAND().