Bootstrap

redis和mysql数据做混合分页查询_分页查询和redis

当查询结果包含的数据量非常大的时候,往往需要分页查询。本文总结一些分页查询的技巧,及如何用mysql cassandra和redis等实现分页查询的方案。

问题

我在做论坛的是时候遇到了如下的问题。论坛里可以有很多的主题topic,每个topic对应到很多回复reply。现在要查询某个topic下按照replyTime升序排列的第pageNo页的reply,每页pageSize个reply。 reply是存放在mysql中的。以前的实现是利用mysql的limit查询

select * from reply where topicId = ? order by replyTime asc limit (pageNo - 1) * pageSize, pageSize

由于现在有很多的主题的回复很多,当有人查询第几百甚至几千页的时候,mysql性能表现很不好。“select limit offset, size” 只要offset太大,传统的关系型数据库的性能表现都不好。 如果能够利用带索引的查询条件先过滤掉一部分数据,就可以大大提高性能,比如:

select

*

from

reply

where

topicId = ?

and replyId > lastReplyIdOfCurrentPage

order by

replyTime asc

limit

(pageNo - currentPageNo) * pageSize, pageSize

lastReplyIdOfCurrentPage 是当前页的最后一个reply的id。currentPageNo是当前页的页号。这里用replyId过滤条件,把前面页的内容过滤掉,这样减少

;