Search code examples
mysqlperformancelimit

How can I speed up a MySQL query with a large offset in the LIMIT clause?


I'm getting performance problems when LIMITing a mysql SELECT with a large offset:

SELECT * FROM table LIMIT m, n;

If the offset m is, say, larger than 1,000,000, the operation is very slow.

I do have to use limit m, n; I can't use something like id > 1,000,000 limit n.

How can I optimize this statement for better performance?


Solution

  • Perhaps you could create an indexing table which provides a sequential key relating to the key in your target table. Then you can join this indexing table to your target table and use a where clause to more efficiently get the rows you want.

    #create table to store sequences
    CREATE TABLE seq (
       seq_no int not null auto_increment,
       id int not null,
       primary key(seq_no),
       unique(id)
    );
    
    #create the sequence
    TRUNCATE seq;
    INSERT INTO seq (id) SELECT id FROM mytable ORDER BY id;
    
    #now get 1000 rows from offset 1000000
    SELECT mytable.* 
    FROM mytable 
    INNER JOIN seq USING(id)
    WHERE seq.seq_no BETWEEN 1000000 AND 1000999;