【发布时间】:2019-11-22 06:20:01
【问题描述】:
环境: NodeJS , Websocket , MySQL , CentOS 服务器
我到底想要什么?
这是我的 MySQL 数据库表“users_history”
+-----+---------+------------------+
| ID | UserID | History |
+-----+---------+------------------+
| 1 | 1 | Login |
| 2 | 2 | Login |
| 3 | 1 | Added new record |
| 4 | 2 | Added new record |
| 5 | 1 | Added new record |
| 6 | 3 | Login |
| 7 | 3 | Added new record |
| 8 | 3 | Added new record |
| 9 | 1 | Added new record |
| 10 | 2 | Deleted recoed |
+-----+---------+------------------+
我想根据他们的 UserID 将他们的历史记录发送到他们的 Websocket 连接。
问题?
我有两种方法,但不知道哪一种更快,效率更高?
方法一
为每个用户从数据库中选择数据。
示例:
对于用户 1: 从 UserID = 1 的历史记录中选择 *
对于用户 2: 从 UserID = 2 的历史记录中选择 *
对于用户 3: 从 UserID = 3 的历史记录中选择 *
并根据用户 ID 将他们的数据发送给每个用户
.
方法二
在一个查询中选择所有数据并存储在一个数组中,然后过滤每个 UserID 的数据并根据他们的 UserID 发送给用户。
示例:
Select * from history where UserID IN (1,2,3)
【问题讨论】:
-
我相信您一次只需要获取单个用户的历史记录?如果是,为什么需要获取所有其他用户的历史记录。最小化您的查询输出大小。在大多数情况下,这是主要的性能瓶颈。
-
你好@MadhurBhaiya,我需要一次Websocket服务器上所有连接用户的历史记录。
-
@MadhurBhaiya 由于他使用的是实时客户端通信(websockets),他将拥有当前连接的每个用户的 id,我相信他会同时发送每个用户的所有数据时间。在这种情况下,他应该使用方法 #2 来减少到数据库的往返次数。
-
好吧,如果我需要知道这个问题的答案,我会尝试两种方法并在查询周围放置一个开始和停止计时器。或者使用 WorkBench 之类的工具测试查询,它会在每个查询中为您提供时间
-
@Paulpro senario 建议所有用户同时想要这些信息。而且,我想没有真正要求它
标签: mysql arrays node.js performance filter