PHP API脚本非常慢

时间:2014-04-26 15:03:41

标签: php mysql nginx

我正在运行安装了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秒以上?

1 个答案:

答案 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数据库模式。