ORDER BY RAND() operatörünü nasıl optimize edebilirsiniz?
sobes.tech yapay zeka
AI'dan gelen yanıt
ORDER BY RAND()'i optimize etmek zordur, çünkü her satır için rastgele sayı üretmek üzere tam veri seçimi gerektirir. Tipik yaklaşımlar:
-
Rastgele bir kimlik seçimi:
- Tablo satır sayısını alın.
- 0 ile N-1 (veya 1 ile N) arasında rastgele sayı üretin.
- Uygun kaydırma veya
OFFSETile satırı seçin.
SELECT COUNT(*) FROM your_table; -- Toplam satır sayısı = N varsayılır SELECT * FROM your_table LIMIT 1 OFFSET floor(random() * N);Bu yöntem, bir veya birkaç rastgele satır seçmek için uygundur. Büyük veri setleri için verimli değildir.
-
ID aralığına göre rastgele seçim:
- En küçük ve en büyük
id'yi bulun. - Bu aralıkta rastgele sayı üretin.
id >= rastgele_sayıolan satırı seçin,LIMITkullanarak.
SELECT MIN(id), MAX(id) FROM your_table; -- min_id ve max_id elde edildi varsayılır -- Uygulamada, [min_id, max_id] aralığında rastgele bir id üretin -- Örneğin: rastgele_id = min_id + floor(random() * (max_id - min_id + 1)) SELECT * FROM your_table WHERE id >= rastgele_id LIMIT 1;idboşlukları varsa satırları atlayabilir. - En küçük ve en büyük
-
Geçici tablo veya rastgele sıralama ile alt sorgu kullanımı:
- Veri alt kümesi veya sadece
idseçin. - Bu alt küme üzerinde
ORDER BY RAND()uygulayın.
SELECT * FROM your_table AS t1 JOIN (SELECT id FROM your_table ORDER BY RAND() LIMIT 100) AS t2 ON t1.id = t2.id;LIMITalt sorguya uygulanıyorsa yükü azaltır. - Veri alt kümesi veya sadece
-
Ekstra rastgele sayı alanı kullanımı:
- Tabloya rastgele sayı tutan bir alan ekleyin.
- Bu alanı periyodik olarak güncelleyin.
- Bu alana göre sıralayın.
-- Alan ekleme ALTER TABLE your_table ADD random_sort_key FLOAT; -- Periyodik güncelleme UPDATE your_table SET random_sort_key = RAND(); -- Seçim SELECT * FROM your_table ORDER BY random_sort_key LIMIT 10;Şema değişiklikleri ve arka plan güncelleme süreci gerektirir.
-
Fisher-Yates karıştırma algoritması (dışarıda):
- Tüm
idleri veya küçükse tüm verileri seçin. - Uygulamada listeyi karıştırın.
- İlk N öğeyi seçin.
// ids dilimi []int varsayılır // ids = ... // veritabanından ids alın rand.Shuffle(len(ids), func(i, j int) { ids[i], ids[j] = ids[j], ids[i] }) // Artık ilk N öğe rastgele // Bunları tam satır seçmek için kullanabilirsiniz // SELECT * FROM your_table WHERE id IN (...)Sadece az sayıda satır olan tablolar için uygundur.
- Tüm
En uygun yöntemin seçimi, tablonun boyutuna, gereken rastgele satır sayısına ve kullanılan veritabanı sistemine bağlıdır. Büyük tablolardan küçük sayıda rastgele satır seçmek gerekiyorsa, id alma ve ardından OFFSET veya WHERE id IN (...) kullanımı, doğrudan ORDER BY RAND()'den daha verimli olacaktır.