Cum se poate optimiza operatorul ORDER BY RAND()
sobes.tech AI
Răspuns de la AI
Optimizarea ORDER BY RAND() este dificilă, deoarece necesită o selecție completă a datelor pentru a genera un număr aleator pentru fiecare rând. Abordările tipice:
-
Selecția unui identificator aleatoriu:
- Obțineți numărul de rânduri din tabel.
- Generați un număr aleator între 0 și N-1 (sau 1 și N).
- Selectați rândul cu decalajul corespunzător sau
OFFSET.
SELECT COUNT(*) FROM your_table; -- Se presupune că numărul total de rânduri = N SELECT * FROM your_table LIMIT 1 OFFSET floor(random() * N);Acest metodă este potrivită pentru selectarea unuia sau câtorva rânduri aleatorii. Nu este eficientă pentru un număr mare de rânduri.
-
Selecția aleatorie pe baza intervalului de
id:- Găsiți
idminim și maxim. - Generați un număr aleator în acest interval.
- Selectați rândul cu
id >= numărul_aleator, folosindLIMIT.
SELECT MIN(id), MAX(id) FROM your_table; -- Se presupune că s-au obținut min_id, max_id -- În aplicație, generați un id aleator în intervalul [min_id, max_id] -- De exemplu: id_aleator = min_id + floor(random() * (max_id - min_id + 1)) SELECT * FROM your_table WHERE id >= id_aleator LIMIT 1;Poate omite rânduri dacă există lacune în
id. - Găsiți
-
Crearea unei tabele temporare sau utilizarea unei subinterogări cu sortare după numărul aleator:
- Selectați un subset de date sau doar
idîn subinterogare. - Aplicați
ORDER BY RAND()pe acest 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;Reduce sarcina dacă
LIMITeste aplicat subinterogării. - Selectați un subset de date sau doar
-
Utilizarea unui câmp suplimentar cu un număr aleator:
- Adăugați un câmp în tabel pentru stocarea unui număr aleator.
- Actualizați periodic acest câmp pentru toate rândurile.
- Sortează după acest câmp.
-- Adăugare câmp ALTER TABLE your_table ADD random_sort_key FLOAT; -- Actualizare periodică UPDATE your_table SET random_sort_key = RAND(); -- Selecție SELECT * FROM your_table ORDER BY random_sort_key LIMIT 10;Necesită modificări în schema și procesul de actualizare în fundal.
-
Algoritmul de "amestecare" (Fisher-Yates) în afara bazei de date:
- Selectați toate
id(sau toate datele dacă sunt mici). - Amestecați lista în aplicație.
- Selectați primele N elemente.
// Se presupune că ids este []int // ids = ... // Obțineți ids din baza de date rand.Shuffle(len(ids), func(i, j int) { ids[i], ids[j] = ids[j], ids[i] }) // Acum primele N elemente din ids sunt aleatorii // Le puteți folosi pentru selectarea rândurilor complete // SELECT * FROM your_table WHERE id IN (...)Potrivit doar pentru tabele cu un număr mic de rânduri.
- Selectați toate
Alegerea metodei optime depinde de dimensiunea tabelului, de numărul de rânduri aleatorii necesare și de sistemul de gestionare a bazelor de date specific. Pentru cele mai multe cazuri, când trebuie selectate câteva rânduri aleatorii dintr-un tabel mare, combinația de obținere a id-urilor și apoi OFFSET sau WHERE id IN (...) va fi mai eficientă decât sortarea directă după RAND().