Rasgele neden olur.

4 Cevap php

Ben MySQL tablosu ve performans bazı rasgele veri (1 satır) göstermek gerek benim için çok önemli. Bu mutlaka kesinlikle eşsiz ve süper rastgele veri olmak zorunda değildir, bu yüzden iki seçeneğiniz var:

1) (my table> 500 000 satır vardır) veritabanını sorgula;

2) Otomatik olarak haftada bir düz metin dosyası oluşturun veya bir şey ile (db sonuçları) veya bir dizi ile php dosyası, en, 400-500 satırları söylemek ve muhtemelen {[(0 kullanarak (ondan bazı rasgele sonuçlar alalım)]} olduğu gibi).

Hangi yol daha iyi / daha hızlı?

Teşekkür ederim.

4 Cevap

Tablo sadece o bir artan benzersiz kimliği varsa

SELECT * FROM table WHERE id = $r

$ yukarıda önerileri var benzersiz numara r.

Veritabanını sorgulamak.

AMA sorgulayarak

SELECT * FROM tablename ORDER BY rand() LIMIT 1

Bu her satır için rastgele bir numara atar, ve sonra maksimum verir gibi.

Bunun yerine, satır sayısını, daha sonra bu değer içinde rastgele bir sayı olsun ve satır döndürür

$numrows = mysql_num_rows();
$r = rand(0, $numrows-1);
$sql = "SELECT * FROM tablename LIMIT $r, 1";

Kesinlikle don't birçok insan kullanmak hile kullanmak:

SELECT * FROM MyTable ORDER BY RAND() LIMIT 1;

Bu sorgu basit görünüyor ama bir performans katil olacağından emin olabilirsiniz.

Bu hızlı bir çözüm olabilir:

SELECT * FROM MyTable WHERE id > RAND() * (SELECT MAX(*) FROM MyTable) LIMIT 1;

Bu, daha sık boşluklar takip satırları toplama gibi bazı anomalileri vardır. Ama sen doğru, hızlı değil istiyorum dedi. MyISAM kullanırken InnoDb gibi işlem tabloları kullanılarak, ve hızlı zaman MAX() ve COUNT() gibi agrega Not yavaştır.

Orada verimli bu sitede ve Google'da sorgu ile rastgele bir sonuç elde etmek için nasıl malzeme bol, böylece sizin "düzgün sorgu yazmak nasıl" sorusuna dikkat çekmek gerekir.

Eğer bütün hafta / gün / saat için aynı sonucu isterseniz ikinci kısmı, daha sonra kolayca bir dosyaya yazar, sonuç alan bir cronjob yazabilirsiniz ve bu dosyadan uygulama çekme var. Dahaki sefere cronjob bu uygulamayı yeni bir sonuç vererek, dosyanın eski sürümü üzerine yazacaktır çalışır. Bu cronjob bile HTML (ya da herneyse) oluşturmak ve web sunucusunun önbelleğe yarar sağlayan, web hiyerarşi içinde statik bir sayfa koyabilirsiniz. Web sunucusunun önbellekleme veritabanı I / O soru karşısında diski inkâr gerekir, ve veritabanı ağır yük altında genellikle varsa size yardım sona erebilir.