Mysql 分页整理

轻量数据与大量数据的分页完全是两回事,如果没有很好地进行优化,很可能会导致性能的直线下降。现在对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中可以得到两个结果:
- 得到Limit的内容
- 得到去除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