How can i optimize MySQL's ORDER BY RAND() function?

前端 未结 8 2287
天命终不由人
天命终不由人 2020-11-22 00:58

I\'d like to optimize my queries so I look into mysql-slow.log.

Most of my slow queries contains ORDER BY RAND(). I cannot find a real solu

8条回答
  •  一向
    一向 (楼主)
    2020-11-22 01:20

    The solution for your dummy-example would be:

    SELECT  accomodation.ac_id,
            accomodation.ac_status,
            accomodation.ac_name,
            accomodation.ac_status,
            accomodation.ac_images
    FROM    accomodation,
            JOIN 
                accomodation_category 
                ON accomodation.ac_category = accomodation_category.acat_id
            JOIN 
                ( 
                   SELECT CEIL(RAND()*(SELECT MAX(ac_id) FROM accomodation)) AS ac_id
                ) AS Choices 
                USING (ac_id)
    WHERE   accomodation.ac_id >= Choices.ac_id 
            AND accomodation.ac_status != 'draft'
            AND accomodation_category.acat_slug != 'vendeglatohely'
            AND ac_images != 'b:0;'
    LIMIT 1
    

    To read more about alternatives to ORDER BY RAND(), you should read this article.

提交回复
热议问题