Rastgele Kayıtlar MySQL PHP

6 Cevap php

Ben büyük veritabanları RAND () ORDER BY ile SQL sorguları çalıştırmak için iyi bir fikir olmadığını okudum.

Yani burada kodu kırma benim atış. Kod rastgele satır kapmak için ikinci bir seçme yapmak, sonra veritabanından 10 rasgele kimlikleri seçmek gerekiyor.

$sql = "SELECT id FROM table WHERE image != ''
    	ORDER BY id DESC LIMIT 50;";

$result = mysql_query($sql);


while($row = mysql_fetch_array($result))
{
    foreach($row as $key => $value)
    {
    	$array[] = $value;
    }
}
$rand_keys = array_rand($array, 10);

foreach($rand_keys as $value)
{

    $rand_arr[] = $array[$value];

}
$rand_list = implode("," , $rand_arr);

$sql = "SELECT image FROM table
    	WHERE image != ''
    	AND id IN ($rand_list)";
$result = mysql_query($sql);

Herhangi bir öneri hızlandırmak veya kolaylaştırmak için?

6 Cevap

Five Dört şey:

  1. Sadece 12 gerekiyorsa Why are you fetching 50 id s (Bu son 50 12 kimlikleri alıyoruz -? Mantıklı olsa kelimenin genel anlamda özellikle rastgele değil - bu kasıtlı olduğunu Lütfen satır alt kümesi rastgele satırları almak istiyor?).

  2. Sizin için yavaş olmadığını görmek için SQL deyimi ORDER BY RAND() profilli var? Dataset ne kadar büyük?

  3. Sen zaten sadece id s dışarı aldı ettik beri, son sorguda WHERE image != '' gerekmez hangi için image != ''.

  4. Eğer 12 değerleri istediğiniz söylüyorlar - Neden array_rand($array, 10) yapıyorsun?

  5. Böyle rastgele değerler üzerinden toplama kolaylaştırabilirsiniz:

$rand_arr = array_rand(array_flip($array), 12);

Ben yukarıdaki 1 ve 2 ile kabul ediyorum - veri ikamet hangi aynı seviyede, aynı şeyi yapmak için yazmak gerekir az cruft adresinden uygulama içinde rastgele veri seçimini gerçekleştirmek eğer.

Zarif bunu yapmak için özellikle iyi yolu hiç yok.

Ama yönde bir dizi ona kesmek olabilir. Dataset doğru boyutu hakkında ise (çok büyük "rand tarafından sırayla ()" ama çok büyük değil), sıralı id değerleri vardır ve genellikle çok silmeyin, her zaman böyle bir şey yapabilirsiniz:

SELECT MIN(id) as min, MAX(id) as max FROM table

"Min" ve "max" (dahil) arasında rasgele tamsayılar bazı sayısı N oluşturun. Hadi 50 diyelim. Eğer tablodan bir şey silmek asla varsa, N muhtemelen 12 olabilir. Eğer silerseniz, bazı peçete arithmatic yapmak ve iyi bir sayı anlamaya. Muhtemelen yüksek tarafında err olabilir.

SELECT * FROM table WHERE id IN (<your set of integers>) AND image_id = '' LIMIT 12;

En az 12 sonuç var emin olmak için kontrol edin. Değilse, temelde tekrar ve birleştirir.

Büyük kümeler için, bu yöntem Kimlik dizisi çok seyrek değildir, özellikle, RAND () ORDER BY daha iyi çalışması gerekir.

I would focus on Dominic's point 5 as a fairly low impact way to retrieve data randomly. You can sort() that list of IDs also (I believe MySQL detects this and skips sorting that list for you.)

Büyük veri kümeleri ve (aslında bir tablo önbelleğe) hayata görüşlerini içeren yüksek talep oranları için başka teknikler vardır. Büyük, yoğun bir masanın üzerinde varolan performans sorunu çözmek için çalışıyor musunuz?

Başka bir seçenek rastgele bir numaralı seribaşı karma işlevi kullanmak ve bu konuda sıralamak için.

Tablo için maksimum ve minimum kimlikleri almak ve max ve min arasında rasgele bir sayı üretmek için PHP'nin rand () işlevini kullanın.

Sonra size hash fonksiyonu tohum için bu numarayı kullanın. SQL {tuz} varsayalım PHP tarafından oluşturulan rastgele tamsayı anlamına gelir

SELECT image FROM table
WHERE image != ''
ORDER BY MOD(ABS({salt}-id), MOD({salt}, 10)), ABS({salt}-id));

Siz PHP MOD ({} tuz, 10) hesaplama yapmak ve sorguda değer geçirerek biraz optimize olabilir.

Rowsize aşırı büyük değilse, ben sadece 50 satır seçme ve uygulamada bunlardan 12 rastgele bir listesini tutmak profili olacaktır. Evet, bu seçili satır% 80 atmadan demektir. Konuştuğunuz zaman 50% 80 gerçekten bir suç mu? Bu şey SQL tür de iyi değildir.