一般的分页SQL都是:SELECT * FROM table_name limit 0,10,这种SQL在数据量不大的时候运行是没有问题的,表数据量的大小并不一定是100W,1000W这种具体行数来判断还是要看表结构如果都是整型而且字段数量并不多几千万行也不算是大表,如果字段很多,还有很多字符型的100W查询起来就很费劲了。
分页优化的思路
利用主键索引优化
- 每次利用最后一个id值来进行筛选数据。
SELECT * FROM table_name where id > 1000 limit 10
- 利用主键来作为偏移量,这个用起来限制比较多,表内的主键必须是自增顺序的而且不能有删除数据的操作。
SELECT * FROM table_name where id > (pageoffset) limit 10
pageoffset 的计算为 (page - 1) * limit。
利用主键索引来优化弊端就是只能应付简单的分页需求,如果还有其他筛选条件该方法则不适用了。
多条件筛选的分页只能借助于第三方工具来办到了,可以使用ES,或者把热点数据放到Redis中也是一个思路。
参考文章:
- segmentfault.com/a/119000002…
- canal:基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
- Mysql大表分页