繁体   English   中英

PHP API脚本非常慢

[英]PHP API scripts extremely slow

我正在运行安装了Nginx Web服务器的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秒钟以上的时间来执行此查询?

几件事:

  • 使用*而不是列列表通常是一个坏主意,风险是添加不需要的列,并且该列可能包含大量的二进制数据,这会使查询变慢。 因此,当您遇到速度问题时,当然不必担心。

  • 您可能会优先考虑逻辑运算符和/或问题

您的查询是:

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,包含按日期排序的正确排序,删除的内容,当然还有朋友的标识符。

  • 用户与朋友之间的关系很难管理,尤其是在交易量越来越大的情况下,通常要建立一个包含发布/订阅系统(发布订阅渠道系统)的社交网站。 您应该研究一些pubsub数据库架构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM