PHP vs MySQL rastgele bir öğe alma

2 Cevap php

(100K kayıtları yönetmek zaman) olan daha etkilidir:

A. Mysql

SELECT * FROM user ORDER BY RAND();

Elbette, bundan sonra ben zaten o kayıttaki tüm alanları olurdu.

B. PHP

$ var memcached kullanıyorum 1 saat ya da öylesine için "id_user BY kullanıcı SİPARİŞ id_user SELECT" tüm veri tutun ... ve daha sonra cache_array:

$ Id = array_rand ($ cache_array);

Elbette, bundan sonra ben bir MYSQL çağrı yapmak zorunda:

SELECT * FROM user WHERE id_user = $id;

bu yüzden ... Hangi daha verimli? A veya B?

2 Cevap

Soru bu tür cevaplamak için doğru yolu bir kriter yapmaktır. Hızlı ve kirli bir uygulama, her şekilde yapmak ve sonra bir daha iyi performans gösterdiğini belirlemek için benchmark testleri çalıştırın.

MySQL bir dizin kullanmak için imkansız çünkü ORDER BY RAND() yavaş olduğu bilinmektedir, o söyledikten sonra. MySQL temelde tablodaki her satır için bir kez RAND() işlevini çalıştırın ve sonra geri RAND() geldi ne dayalı satırları sıralamak.

Memcached havai tam tablo taraması maliyeti daha az olmaktadır eğer memcached tüm user_id s depolamak ve daha sonra rastgele bir eleman dizisini oluşturan seçerek diğer fikri daha iyi performans olabilir. Dataset büyük ya da yıpranmışlık bir sorun varsa, size rağmen sorunları çalıştırmak olabilir. Ayrıca uygulama için bazı karmaşıklığı ekliyoruz. Ben başka bir yol aramak için çalışacaktı.

Sana hem önerilerinizi geride olabilecek bir üçüncü seçenek vereyim: kullanıcı tablosunda bir count(user_id) satır seçin ve ardından php 0 arasında rastgele bir sayı oluşturmak var ve sonucu {[(0) }] eksi 1, dahil. Sonra SELECT * FROM user LIMIT 1 OFFSET random-number-generated-by-php; yapmak.

Yine, sorular bu tür cevap vermek doğru yolu kriter değildir. Başka bir şey spekülasyondur.

İlki inanılmaz derecede yavaş olduğu için

MySQL creates a temporary table with all the result rows and assigns each one of them a random sorting index. The results are then sorted and returned.

Daha ayrıntılarıyla oluyor this blog post.