该段 Sql 分页代码能够优化吗?

2015-11-19 09:05:58 +08:00
 decdfgfe

代码如下
$sql="select id,second_level,third_level,title,description,update_time,thumb from p_ed2k where second_level='$cid' and third_level='$scid' order by id DESC limit $offset,$perNum";
分页越到后面越慢, second_level 和 third_level 已经做索引

1799 次点击
所在节点    数据库
31 条回复
akira
2015-11-19 10:40:44 +08:00
分页是不需要精确的。
如果 id 是顺序并且连续的话,可以先获得 maxid ,然后通过简单计算,获得对应分页的起始 id 和结束 id 。
pythoner
2015-11-19 10:48:31 +08:00
对分页的优化基本就是 @raysmond 这个思路,我个人比较推荐用 redis 来搞,用 list 可以很方便地将记录 id 和页数对应起来。

再极端一点,把列表页中需要显示的字段也通通放到 redis 里,再用 lua 写一个方法,根据页数 id 的对应关系,一次性将当前页的数据拼好取出来。

再极端一点,用 nginx_lua 实现上一步。
scalai
2015-11-19 10:54:46 +08:00
不知道这样行不:
建这个索引 second_level , third_level , id, title, description, update_time, thumb
或 second_level , third_level , id

刚看了 数据库索引设计与优化 这本书,没有实操过。。。
raysmond
2015-11-19 10:58:10 +08:00
@pythoner 对啊,基本上你说的第一条就够用, redis 的 range 这些方法太好用了。至于后面两个,除非有高要求,量大,一般不用。量不是很大的,直接把一个对象扔进 redis 里去,懒得拼对象了。
scalai
2015-11-19 11:14:00 +08:00
@scalai 话说, second_level 和 third_level 看名字像是重复率很高。
hgc81538
2015-11-19 13:04:21 +08:00
是 second_level 做一個索引, third_level 做一個索引,共兩索引?
還是 second_level 和 third_level 做同一個索引?

還有你的 SQL 有注入的問題,小心
iyaozhen
2015-11-19 13:36:20 +08:00
涨见识了,以前就觉得翻页这个事情好蛋疼。每次算总页数还要 count(*)
wawehi
2015-11-19 13:42:19 +08:00
就这段 SQL ,要想优化得快,还得上缓存,推荐 redis , list, zhash ,结合起来用,非常高效
otakustay
2015-11-19 15:50:02 +08:00
最好的办法就是把用于查询的字段再单独弄张表,从这个表拿到 id ,再用 in 通过 id 去拿数据……
xiamingchong
2015-11-20 09:22:20 +08:00
@otakustay 才这么点数据没必要的
otakustay
2015-11-20 11:09:41 +08:00
@xiamingchong 不仅仅是数据, avg row size 也有很大的影响

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/237210

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX