Analysis of low performance caused by large offset of LIMIT in MySQL query

  • 2021-11-13 02:58:51
  • OfStack

Preface

As we all know, mysql query uses select command, and limit and offset parameters can read records in a specified range, but offset is too large to affect the query performance and its optimization method

Paging is inevitable in our business system. When you think of paging, you will definitely think of using LIMIT in SQL to achieve it. However, if the incorrect use of LIMIT will lead to performance problems (SQL executes very slowly and may bring down the server), it will also be approved by the leader; So, let's look at how to use LIMIT correctly.

The following words are not much to say, let's take a look at the detailed introduction

LIMIT OFFSET, ROW_COUNT Paging

Ways of Performance Problems


SELECT * FROM myTable ORDER BY `id` LIMIT 1000000, 30 

The person who wrote this SQL statement must have thought this: The MySQL database will directly locate the 10000000 bits that meet the requirements, and then take 30 pieces of data.
However, in fact, MySQL does not work like this.

LIMIT 1000000, 30 means: Scan 1000030 rows that meet the criteria, throw away the previous 1000000 rows, and return to the last 30 rows.

A better way


SELECT t.*
FROM (
  SELECT id
  FROM myTable
  ORDER BY
    id
  LIMIT 1000000, 30
  ) q
JOIN myTable t
ON  t.id = q.id

The general principle is:

Subquery only used index column, did not take the actual data, so does not involve the disk IO, so even a relatively large offset, the query speed will not be too bad.

For those who are interested in specific principle analysis, please see this article: MySQL ORDER BY/LIMIT performance: late row lookups

Postscript

To be continued.

References

Why does MYSQL higher LIMIT offset slow the query down? MySQL ORDER BY / LIMIT performance: late row lookups

Summarize


Related articles: