quick selection of a random row from a large table in mysql

前端 未结 24 1725
旧时难觅i
旧时难觅i 2020-11-22 09:30

What is a fast way to select a random row from a large mysql table?

I\'m working in php, but I\'m interested in any solution even if it\'s in another language.

相关标签:
24条回答
  • 2020-11-22 10:00

    I knew there had to be a way to do it in a single query in a fast way. And here it is:

    A fast way without involvement of external code, kudos to

    http://jan.kneschke.de/projects/mysql/order-by-rand/

    SELECT name
      FROM random AS r1 JOIN
           (SELECT (RAND() *
                         (SELECT MAX(id)
                            FROM random)) AS id)
            AS r2
     WHERE r1.id >= r2.id
     ORDER BY r1.id ASC
     LIMIT 1;
    
    0 讨论(0)
  • 2020-11-22 10:01

    Maybe you could do something like:

    SELECT * FROM table 
      WHERE id=
        (FLOOR(RAND() * 
               (SELECT COUNT(*) FROM table)
              )
        );
    

    This is assuming your ID numbers are all sequential with no gaps.

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

    I have used this and the job was done the reference from here

    SELECT * FROM myTable WHERE RAND()<(SELECT ((30/COUNT(*))*10) FROM myTable) ORDER BY RAND() LIMIT 30;
    
    0 讨论(0)
  • 2020-11-22 10:03

    In pseudo code:

    sql "select id from table"
    store result in list
    n = random(size of list)
    sql "select * from table where id=" + list[n]
    

    This assumes that id is a unique (primary) key.

    0 讨论(0)
  • 2020-11-22 10:07

    I see here a lot of solution. One or two seems ok but other solutions have some constraints. But the following solution will work for all situation

    select a.* from random_data a, (select max(id)*rand() randid  from random_data) b
         where a.id >= b.randid limit 1;
    

    Here, id, don't need to be sequential. It could be any primary key/unique/auto increment column. Please see the following Fastest way to select a random row from a big MySQL table

    Thanks Zillur - www.techinfobest.com

    0 讨论(0)
  • 2020-11-22 10:09

    Add a column containing a calculated random value to each row, and use that in the ordering clause, limiting to one result upon selection. This works out faster than having the table scan that ORDER BY RANDOM() causes.

    Update: You still need to calculate some random value prior to issuing the SELECT statement upon retrieval, of course, e.g.

    SELECT * FROM `foo` WHERE `foo_rand` >= {some random value} LIMIT 1
    
    0 讨论(0)
提交回复
热议问题