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