(Rand kullanmadan mysql veritabanından rastgele satır dönen)

0 Cevap php

Ben bir veritabanından 15 ya da öylesine kayıtları geri çekmek mümkün olmak istiyorum. Benim veritabanı büyüdükçe kullanarak WHERE id = rand() performans sorunlarına neden olabilir gördüm. Gördüğüm tüm çözümleri tek bir rastgele kaydı seçerek yöneliktir. Ben katları almak istiyorum.

Herkes büyük veritabanları için bunu yapmak için etkili bir yol biliyor mu?

edit:

Further Edit and Testing:

Ben yeni bir veritabanı kullanarak MyISAM üzerinde, oldukça basit bir tablo yaptı. autokey (imzasız otomatik sayı tuşu) bigdata (büyük bir blob) ve somemore (orta int): Ben bu 3 alanları verdi. I then applied random data to the table and ran a series of queries using Navicat. Here are the results:

Query 1: select * from test order by rand() limit 15

 Query 2: select * 
          from 
      test 
          join 
      (select round(rand()*(select max(autokey) from test)) as val from test limit 15)                                           as rnd
      on 
          rnd.val=test.autokey;`

(Select ve farklı seçmek hem denedim ve hiçbir gözle fark yarattı)

ve:

Query 3 (I only ran this on the second test):
SELECT  *
    FROM    (
    SELECT  @cnt := COUNT(*) + 1,
            @lim := 10
    FROM    test
    ) vars
    STRAIGHT_JOIN
    (
    SELECT  r.*,
            @lim := @lim - 1
    FROM    test r
    WHERE   (@cnt := @cnt - 1)
            AND RAND(20090301) < @lim / @cnt
    ) i
ROWS:            QUERY 1:               QUERY 2:         QUERY 3:
2,060,922          2.977s                 0.002s            N/A

3,043,406          5.334s                 0.001s            1.260     

Ben nasıl sorgu 3 ölçekler görebilirsiniz böylece daha fazla satır yapmak ister, ama şu anda, it seems as though the clear winner is query 2 olur.

Ben bu test kadar tamamlamayı ve bir cevap bildirmek, ve ben tüm bu verileri ve test ortamı kurmak ise, can anyone recommend any further testing? önce

0 Cevap