我正在运行安装了nginx网络服务器的Ubuntu 13.04。我正在为我的网站上的用户编写一个迷你社交网络,但出于某种原因我使用的脚本来加载诸如个人资料和"墙壁等的内容。有时很慢。并非所有这些都很慢,但特别是新闻源脚本,它显示了朋友最近的帖子。
我在整个脚本中添加了一堆microtime()
个检查,看起来获取最近帖子的查询占用的时间最多。我试图尽可能地优化它,但它似乎仍然很慢。我正在使用MySQLi。这是我的疑问:
SELECT `id`,`posterName`, `posterUUID`, `message`, `postDate`, `likes`, `whoLiked`
FROM `wallposts`
WHERE (
`wallUUID` IN (' . implode(',', $friendStr) . ')
AND posterUUID = wallUUID
)
OR wallUUID="GLOBAL"
AND isDeleted=0
ORDER BY `postDate` DESC
LIMIT 25
使用SELECT *
会更快吗,因为我几乎都选择了大部分列?我不知道还有什么可以尝试的,这就是我来这里的原因。
任何帮助请问我能做什么/不做什么,以防止它仅为此查询花费5秒以上?
答案 0 :(得分:0)
有几件事:
使用*
代替列表通常是一个坏主意,风险是添加一个您不需要的列,此列可能包含大量二进制数据,这样做让你的查询更慢。因此,当你遇到速度问题时,当然不需要关心它。
您可能具有逻辑运算符和/或问题的优先级
您的查询是:
WHERE (A)
OR B
AND C
我很确定你的意思是:
WHERE (
(A)
OR B
)
AND C
但是AND优先,所以你拥有的是:
WHERE (A)
OR (
B
AND C
)
如果有疑问,请使用括号(我对此有疑问,但我会使用括号)。
你的第一个WHERE
条件很奇怪:
在哪里(
wallUUID
IN(42,43,44,45,46)
AND posterUUID = wallUUID
)
这意味着我会猜测墙上帖子的朋友标识符的过滤器,然后是一个过滤器,其中说明每行我们需要为海报uid和墙壁ID具有相同的ID。
我很漂亮,这不是你想要的。也许你需要一个连接查询。或许不是,如果没有表格的结构,很难猜测
你需要一个相当不错的索引来获得朋友帖子结果的优化结果,一个以当前用户ID开头的dindex,包含按日期排序,删除的东西,当然还有朋友标识符。
用户 - 朋友关系很难管理,特别是当卷变大时,通常构建社交网站涉及pub / sub系统(发布订阅频道系统)。您应该学习一些pubsub数据库模式。