更正声明:关于“谈一谈分页查询”

sorra 发表于 2016 12/30 20:27 修改于 01/11 21:47 阅读数407

很抱歉,谈一谈分页查询这篇文章有一个错误,虽然很窘迫,但我还是要公开这个错误,以免误导读者。

文中是这么写的:

以微博为例:用户关注了100个人,现在他要刷微博,第1页要有20条,怎么查询?

SQL层面无法解决这一问题。……

这段叙述是错的,SQL层面能解决这一问题。轻境界用的是一种复杂模型,确实无法用一条SQL解决;而我在文中介绍的是新浪、推特的简单模型,想当然地以为也不能用一条SQL解决。

如果是按发表时间排序,SQL如下:

select * from tweet where author_id in (?) order by when_created desc limit 20;

因为是用author_id过滤,用when_created排序,所以单列索引无效,需要建联合索引。

如果是按主键(id)排序,SQL如下:

select * from tweet where author_id in (?) order by id desc limit 20;

author_id有单列索引即可,无需给主键(id)建索引。

在语句开头加上explain可查看SQL执行计划,了解索引命中情况。

当你要做深入的优化时(例如利用Redis等缓存),就不能只用一条SQL了。