MySQL select 10 random rows from 600K rows fast

后端 未结 26 2983
粉色の甜心
粉色の甜心 2020-11-21 05:06

How can I best write a query that selects 10 rows randomly from a total of 600k?

相关标签:
26条回答
  • 2020-11-21 05:23

    Simple query that has excellent performance and works with gaps:

    SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id
    

    This query on a 200K table takes 0.08s and the normal version (SELECT * FROM tbl ORDER BY RAND() LIMIT 10) takes 0.35s on my machine.

    This is fast because the sort phase only uses the indexed ID column. You can see this behaviour in the explain:

    SELECT * FROM tbl ORDER BY RAND() LIMIT 10:

    SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id

    Weighted Version: https://stackoverflow.com/a/41577458/893432

    0 讨论(0)
  • 2020-11-21 05:23

    This is how I do it:

    select * 
    from table_with_600k_rows
    where rand() < 10/600000
    limit 10
    

    I like it because does not require other tables, it is simple to write, and it is very fast to execute.

    0 讨论(0)
  • 2020-11-21 05:24

    How to select random rows from a table:

    From here: Select random rows in MySQL

    A quick improvement over "table scan" is to use the index to pick up random ids.

    SELECT *
    FROM random, (
            SELECT id AS sid
            FROM random
            ORDER BY RAND( )
            LIMIT 10
        ) tmp
    WHERE random.id = tmp.sid;
    
    0 讨论(0)
  • 2020-11-21 05:27

    I am getting fast queries (around 0.5 seconds) with a slow cpu, selecting 10 random rows in a 400K registers MySQL database non-cached 2Gb size. See here my code: Fast selection of random rows in MySQL

    $time= microtime_float();
    
    $sql='SELECT COUNT(*) FROM pages';
    $rquery= BD_Ejecutar($sql);
    list($num_records)=mysql_fetch_row($rquery);
    mysql_free_result($rquery);
    
    $sql="SELECT id FROM pages WHERE RAND()*$num_records<20
       ORDER BY RAND() LIMIT 0,10";
    $rquery= BD_Ejecutar($sql);
    while(list($id)=mysql_fetch_row($rquery)){
        if($id_in) $id_in.=",$id";
        else $id_in="$id";
    }
    mysql_free_result($rquery);
    
    $sql="SELECT id,url FROM pages WHERE id IN($id_in)";
    $rquery= BD_Ejecutar($sql);
    while(list($id,$url)=mysql_fetch_row($rquery)){
        logger("$id, $url",1);
    }
    mysql_free_result($rquery);
    
    $time= microtime_float()-$time;
    
    logger("num_records=$num_records",1);
    logger("$id_in",1);
    logger("Time elapsed: <b>$time segundos</b>",1);
    
    0 讨论(0)
  • 2020-11-21 05:27

    Use the below simple query to get random data from a table.

    SELECT user_firstname ,
    COUNT(DISTINCT usr_fk_id) cnt
    FROM userdetails 
    GROUP BY usr_fk_id 
    ORDER BY cnt ASC  
    LIMIT 10
    
    0 讨论(0)
  • 2020-11-21 05:27

    I guess this is the best possible way..

    SELECT id, id * RAND( ) AS random_no, first_name, last_name
    FROM user
    ORDER BY random_no
    
    0 讨论(0)
提交回复
热议问题