انتخاب تصادفی رکورد از دیتابیس

[rtl]

سلام دوستان

خسته نباشید همگی

دنبال یه روش خوب و بهینه برای دریافت تصادفی اطلاعات از دیتابیس میگردماینترنت و زیر و رو کردمروشهایی که وجود داره معمول ترین روش ORDER BY RAND() هست،

این روش بهینه نیست و وقتی رکوردای داخل جدول زیاد بشن وقت زیادی میگیره

روش بعدی که پیدا کردم که روشم خودم کار کردم بازم بهینه نشد، استفاده از توابع procedural توی mysql هست.[/rtl]

[sql]CREATE DEFINER=root@localhost PROCEDURE random_product(IN cnt INT)

BEGIN

DROP TEMPORARY TABLE IF EXISTS product_rands;

CREATE TEMPORARY TABLE product_rands ( rand_id INT );

loop_me: LOOP

IF cnt < 1 THEN


  LEAVE loop_me;


END IF;


set @minv := (SELECT MIN(id) FROM products);


    set @maxv := (SELECT MAX(id) FROM products);


INSERT INTO product_rands


   SELECT r1.id


     FROM products AS r1 JOIN


          (SELECT @minv+(RAND() * (@maxv-@minv)) AS id)


           AS r2


    WHERE r1.id >= r2.id


    ORDER BY r1.id ASC


    LIMIT 1;





SET cnt = cnt - 1;

END LOOP loop_me;END[/sql] [rtl]خوب این روش واسه جدولای بزرگ و کوچیک کلا واسش فرق نداره، جفتش فعلا روی LocalHost حدود 0.3 ثانیه وقت میگیره که خیلی زیـاااده! :expressionless: :( [/rtl]

روش سوم دیگه پیدا نکردم اگه نظری دارین خوشحال میشم راهنمایی کنید :slight_smile:

[rtl]بازه رو محدودتر کنی جواب نمیگیری؟ مثلا[/rtl]

select * from tbl where id>1000 and id<2000 order by RAND() limit 1

[rtl]خوب اول که من به N تا رکورد احتیاج دارم

بعدم جوابو میگیرم ، بهینه بودن کوئری واسم در درجه اول قرار داره :-/[/rtl]

[rtl]خب به هر تعداد که نیاز دارید ، بازه تون رو براساس اون تنظیم کنید ، مثلا چنانچه به صد تا نیاز دارید از آی دی 1 تا آی دی 500 رو بگردید و در درخواست بعدی از 500 تا 1000 و همینطوری … اینطوری بازه مورد نظر کوچکتر میشه و مطمئنم سریعتر انجام میده[/rtl]

[size=2]آها راست میگی مرسی امتحان میکنم[/size]