2009-05-12 8 views
6

MySQL sunucusunda büyük bir sonuç kümesinin sıralama düzenini veya PHP'de verileri aldıktan sonra rastgele hızlandırmak daha mı hızlı?MySQL Server'da veya PHP'de birçok sonucu rastgele hale getirmek için daha hızlı

Herhangi bir tarafın herhangi bir tarafını veya hatta anekdotsal deneyimi yedeklemek için herhangi bir veri var mı?

+1

bir sorun bu konuda endişe önce, her iki durumda da var olup olmadığını göstermek için test edebilir. Çok önemli olan çok büyük miktarda veriye sahip olmanız gerekecek, umarım beklerim. Aslında, bunu yayınlama ve cevapları sindirme zamanını karşılaştırmak, bir yaklaşımı seçmek, uygulamak, değiştirmek ve karşılaştırmakla karşılaştırmak ilginç olacaktır. (Sadece spekülasyon, bir eleştiri değil; bütün bu zihinsel egzersizleri yapın.) Birisi de bu soruyu cevap verirse – dkretz

+0

evet, ama, o zaman tüm zaman bu yatırımın olmadan öğreneceksiniz ve ben ve diğerleri kodlarını artırabilir. Şu anda bir problem olup olmadığını sormak iyi bir soru. – nickf

cevap

5

Benim eğitimli tahminim MySQL eller aşağı kazanır olmasıdır. Bu şekilde veri işlemek için yapılır. Tüm verileri PHP'yi sıralamak için taşımak zorunda kalmanın, onu önyükleme için bir avantaj sağladığını.

Elbette, bazı kıyaslamalar yaparak kendiniz öğrenebilirsiniz.

+0

Ben şu anda elimizde yeterli veri sanmıyorum ancak şu an kriter yapamaz, bu muhtemel cevabı olduğunu kabul ediyorum, ama yakın gelecekte bir sorun olarak görüyorum. – UnkwnTech

1

MySQL içinde RAND() kullanımı kesinlikle daha hızlı olacaktır.

PHP ile rastgele bir şekilde yazmak için, db'yi sorgulamanız ve verileri belleğe aktarmanız gerekir; bu nedenle, sıralama işleminize ek yük ekleyerek tamamen ek bir adımınız olur.

MySQL'de, bu sorgu türü, dizine eklenmiş bir değere göre sıralama kadar hızlı olmayacaktır, ancak yine de yüksek düzeyde iyileştirilmiş olacaktır. Eğer ifade tarafından düzenin nesne olarak rand() kullanın

0

Not: Elbette

select * from foo_table order by rand() limit 100 
4

Eğer MySQL tarafında yapmalı.

Ama filesort gerektirdiğinden ORDER BY RAND()MySQL yılında çok verimsiz olduğunu unutmayın.

SELECT * 
FROM (
     SELECT @cnt := COUNT(*) + 1, 
       @lim := 10 
     FROM t_random 
     ) vars 
STRAIGHT_JOIN 
     (
     SELECT r.*, 
       @lim := @lim - 1 
     FROM t_random r 
     WHERE (@cnt := @cnt - 1) 
       AND RAND() < @lim/@cnt 
     ) i 

performans detayları için bloguma bu makaleye bakın: Bir For

tek bir tablo taraması ile verimli 10 rastgele satır seçmek için nasıl bakın 1,000,000 kayıtları masa, bir saniyeden az yerine 15 secon çalışır ORDER BY RAND() kullanarak ds.

İlgili konular