Mysql 分页整理

obsidiannn Lv3

轻量数据与大量数据的分页完全是两回事,如果没有很好地进行优化,很可能会导致性能的直线下降。现在对mysql分页做一个简单的小整理…

最简单的分页

select * from content order by id desc limit 0, 10

当数据量多了一些的时候:

select * from content order by id desc limit 1000000, 10

当数据量比较大的时候,这样分页的方案会导致最后几页的查询速度下降。

所以

SELECT * FROM table WHERE id >= (SELECT id FROM table
  LIMIT 1000000, 1) LIMIT 10;

因为id是拥有索引的主键,所以,效率会比纯limit高一些

什么是更优解?

SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010;

另:

如果找寻的id并不连续,可以先找出id,再用in的方式查询:

SELECT * FROM table WHERE id IN(10000, 100000, 1000000...);

另一种方式: FOUND_ROWS()

使用MySql中的函数FOUND_ROWS(),在SELECT中可以得到两个结果:

  1. 得到Limit的内容
  2. 得到去除Limit以后所有行数

SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:

select SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
  • 如果在前一条语句中使用SQL_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回第一条语句没有LIMIT时返回的行数。
  • 如果在前一条语句中没有使用SQL_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回前一条语句实际返回的行数。
  • 如果使用 SELECT SQL_CALC_FOUND_ROWS,MySQL必须计算所有结果集的行数。尽管这样,总比再执行一次不使用LIMIT的查询要快多了吧,因为那样结果集要返回客户端滴。(另外:应该不单是没有将结果集返回的原因,还有原因可能是比如LIKE之类比较费劲的SQL不需要再去劳累一次。)

– 注意下面语句中的条件 LIKE

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE Name LIKE ‘%string%’ id > 100 LIMIT 10;
SELECT FOUND_ROWS();

– 上面语句等价于下面语句,但性能方面应该提升非常非常的明显:

SELECT COUNT(*) FROM tbl_name WHERE Name LIKE ‘%string%’ ;
SELECT * FROM tbl_name WHERE Name LIKE ‘%string%’ id > 100 LIMIT 10;
  • Title: Mysql 分页整理
  • Author: obsidiannn
  • Created at : 2018-04-10 13:52:09
  • Updated at : 2025-03-20 00:21:52
  • Link: https://blog.dadonggua.top/2018/04/10/08mysql_page/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments