MySQL select 10 random rows from 600K rows fast

后端 未结 26 3050
粉色の甜心
粉色の甜心 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:43

    I needed a query to return a large number of random rows from a rather large table. This is what I came up with. First get the maximum record id:

    SELECT MAX(id) FROM table_name;
    

    Then substitute that value into:

    SELECT * FROM table_name WHERE id > FLOOR(RAND() * max) LIMIT n;
    

    Where max is the maximum record id in the table and n is the number of rows you want in your result set. The assumption is that there are no gaps in the record id's although I doubt it would affect the result if there were (haven't tried it though). I also created this stored procedure to be more generic; pass in the table name and number of rows to be returned. I'm running MySQL 5.5.38 on Windows 2008, 32GB, dual 3GHz E5450, and on a table with 17,361,264 rows it's fairly consistent at ~.03 sec / ~11 sec to return 1,000,000 rows. (times are from MySQL Workbench 6.1; you could also use CEIL instead of FLOOR in the 2nd select statement depending on your preference)

    DELIMITER $$
    
    USE [schema name] $$
    
    DROP PROCEDURE IF EXISTS `random_rows` $$
    
    CREATE PROCEDURE `random_rows`(IN tab_name VARCHAR(64), IN num_rows INT)
    BEGIN
    
    SET @t = CONCAT('SET @max=(SELECT MAX(id) FROM ',tab_name,')');
    PREPARE stmt FROM @t;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    SET @t = CONCAT(
        'SELECT * FROM ',
        tab_name,
        ' WHERE id>FLOOR(RAND()*@max) LIMIT ',
        num_rows);
    
    PREPARE stmt FROM @t;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    END
    $$
    

    then

    CALL [schema name].random_rows([table name], n);
    

提交回复
热议问题