【发布时间】:2016-11-10 02:47:05
【问题描述】:
问题的标题可能听起来很奇怪,但我的英文无法找到更好的标题。
A 在我的网站上创建了聊天应用程序。现在我想添加通知。
提交新消息时,我正在检查其他用户是否已阅读给定对话中的先前消息。如果他有然后我写一个新的通知。如果他以前没有看过,那么我不会写新的通知。
我使用 mysql count() 函数对字段进行计数,然后执行 php 逻辑。在 CI 中它看起来像这样:
public function ifUnreadMsgs($con_id, $sender_id)
{
$this->db->where('conversation_id', $con_id);
$this->db->where('sender_id', $sender_id);
$this->db->where('seen IS NULL', null, false);
$this->db->from('messages');
$count = $this->db->count_all_results();
if($count > 0){
return true;
}else{
return false;
}
}
我的问题是关于优化的。我知道随着时间的推移我会收到很多信息。假设我在数据库中存储了 1 000 000 条消息。我也知道看到可能“NULL”的那个将是 msg_id 大约。 999 995。我必须经常使用这个查询,用户等待ajax响应,所以我想尽可能减少查询时间。
是否可以向后运行查询并在我达到我正在寻找的值时停止?我考虑过使用 DISTICT 或 LIMIT 关键字来停止但如何向后运行?
编辑:
实际上我需要从最后一行开始循环遍历消息表,在“conversation_id”处停止并查看“seen”是否为 NULL。
【问题讨论】:
-
您是否只是在 SQL 中寻找
ORDER BY关键字?您可以更改结果的排序顺序,然后限制结果,从而有效地为您的查询提供“最后匹配的记录”。 -
LIMIT 是您想要使用的,您也可以通过仅选择某些列来减少压力。然后只需
return ($count > 0);。 -
我认为我的问题源于对 mysql 如何执行查询缺乏了解。 ORDER BY 是从最后一行开始遍历表,还是从第一行到最后一行,然后对结果进行排序?我正在寻找第一个 - 从最后一个开始,向上移动并在加工条件下停止。我不想遍历前 999 990 行,因为我已经知道我不需要它们
-
我问过类似的问题。用
last seen比较怎么样? stackoverflow.com/questions/37739887/…
标签: php mysql codeigniter