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

前端 未结 8 2276
天命终不由人
天命终不由人 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.

    0 讨论(0)
  • 2020-11-22 01:29

    It depends on how random you need to be. The solution you linked works pretty well IMO. Unless you have large gaps in the ID field, it's still pretty random.

    However, you should be able to do it in one query using this (for selecting a single value):

    SELECT [fields] FROM [table] WHERE id >= FLOOR(RAND()*MAX(id)) LIMIT 1
    

    Other solutions:

    • Add a permanent float field called random to the table and fill it with random numbers. You can then generate a random number in PHP and do "SELECT ... WHERE rnd > $random"
    • Grab the entire list of IDs and cache them in a text file. Read the file and pick a random ID from it.
    • Cache the results of the query as HTML and keep it for a few hours.
    0 讨论(0)
提交回复
热议问题