【发布时间】:2013-10-08 15:16:18
【问题描述】:
信息
目前正在构建一个通知页面,其中列出了所有登录的用户通知,其中包含有关每个通知的信息。
例如,没有信息
You have an unread message
有信息
<Sarah> Sent you an message
问题
因为通知需要用户名(用于消息通知)或文章标题(比如您关注作者并且他们发布了新博客文章)等数据,所以一个通知需要从用户表中提取用户名,然后还需要标题来自博客表的博客)这会导致我的页面甚至在本地主机上滞后,我猜一旦上传并在野外测试会变得更糟。
当前代码
function showNotifications($userid){
$STH = $this->database->prepare('SELECT * FROM notifications WHERE user_id = :userid ORDER BY timestamp DESC');
$STH->execute(array(':userid' => $userid));
while($row = $STH->fetch(PDO::FETCH_ASSOC)){
$this->sortNotif($row);
}
关于下面函数的快速解释,因为我有不同类型的通知我为特定类型创建了一堆 ID,例如 type 1 = new message,type 2 = new blog post
function sortNotif($notif){
switch ($notif['type']) {
case "1":
$msg = $this->getMessageData($notif['feature_id']);
$user = $this->userData($msg['sender']);
echo '<li><i>'.timeAgo($notif['timestamp']).'</i><a href="user.php?username='.$user['username'].'">'.$user['first_name'].'</a> sent you a <a href="inbox.php?message='.$msg['id'].'">message</a></li>';
break;
}
}
正如您所看到的,仅显示用户有一条新消息它会创建 2 个查询,并且一旦循环通过 40 个左右的通知,超过 100 个左右的用户就会对服务器造成压力。
结束语
如果有人需要更多信息,请询问,我一定会尽快更新此问题,谢谢!
编辑
以下是以下 cmets 中要求的表结构。
通知
id | user_id | feature_id | type | timestamp | read
用户
id | username | password | first_name | last_name | email | verify_hash | avatar | type
消息
id | receiver | sender | replying_to | deleted | body | timestamp | read
【问题讨论】:
-
你能从你的 sortNotif 函数中的 switch/case 语句中取出一些通用代码吗?您是否使用 MySQL EXPLAIN 或其他工具分析了您的查询?那里有优化的余地吗?
-
我用的是网上找的一个小php sn-p,多次测试了多个页面。 notification.php 页面采用“页面生成时间为 0.6599 秒”。而所有其他“页面在 0.0467 秒内生成”。此外,页面实际上明显变慢了。如果您愿意,如果您有什么建议,我可以尝试另一种方法来测试速度?
-
在这种情况下,是否还有其他因素可能会减慢您的最终页面速度? javascript或图片可能吗?
-
我查看了 chrome 开发工具网络选项卡,它只有一个加载缓慢的 .php 文件,其余的几乎是即时的。
-
也许您可以尝试将 2 个函数(showNotifications 和 sortNotif)合二为一?我认为通过 while 循环迭代的多个 switch 语句可能会减慢整个代码的速度。
标签: php mysql pdo notifications query-optimization