JSON操作与MySQL查询相比,哪一个更能提高效率和减少服务器负载?
首先,我知道它们是完全不同的东西,不能直接比较,但让我解释一下我的问题。我想存储投票以及投票,用户只能从向上投票或向下投票中进行选择。我想记录每个动作,这意味着我必须在数据库中存储更多数据 在这种情况下,我有两个选择。我可以创建两个名为JSON操作与MySQL查询相比,哪一个更能提高效率和减少服务器负载?,mysql,json,database,Mysql,Json,Database,首先,我知道它们是完全不同的东西,不能直接比较,但让我解释一下我的问题。我想存储投票以及投票,用户只能从向上投票或向下投票中进行选择。我想记录每个动作,这意味着我必须在数据库中存储更多数据 在这种情况下,我有两个选择。我可以创建两个名为faq和faq\u vows的表,其结构如下: 方法1: 常见问题解答表列:id,问题(字符串),答案(文本),创建时间(时间戳)和更新时间(时间戳) 常见问题解答投票表列:id,faq\u id(国外),user\u id(国外)和投票(布尔) 或者我可以将所有
faq
和faq\u vows
的表,其结构如下:
方法1:
常见问题解答表列:id
,问题(字符串)
,答案(文本)
,创建时间(时间戳)
和更新时间(时间戳)
常见问题解答投票表列:id
,faq\u id(国外)
,user\u id(国外)
和投票(布尔)
或者我可以将所有内容存储在一个表中,只需在faq
表中添加两列即可。但在这种情况下,我必须以JSON
格式存储投票
方法2:
常见问题解答表列:id
,问题(字符串)
,答案(文本)
,UpVoces(JSON)
,DownVoces(JSON)
,在
创建和更新
示例JSON:{“总计”:5,“用户”:[3,6,10,12,2]}
在第一种情况下,我会启动大量的MySQL查询来完成我的任务。在第二种情况下,我会发出较少的查询,但我必须发出大量的JSON操作
那么,当我们谈论每月增加数千次操作时,哪个选项更能提高效率和减少服务器负载呢?您的第二个选择(将投票者的用户ID存储在JSON对象中)比第一个选择差得多
为什么??它不会扩大规模。要记录对某个项目的第50000次投票,您必须读取一个大型JSON对象,对其进行修改,并使用更新操作在数据库中覆盖它。那将需要很长时间
第80000位选民的投票从上到下都发生了什么变化?这样做的操作有多复杂
在您的第一个备选方案中,每次新投票只需插入一个。。。在重复键更新…
操作中,只需将新行放入投票表。SQL就是这样做的
编辑以这种方式思考此问题:
- 两个实体:用户和faq
- 用户和faq之间的一种关系是:投票
实体表将具有user\u id
和faq\u id
唯一标识符,以及应用程序需要的任何其他列
您的关系表称为“投票”
,每次投票将有一行。它将user\u id
与faq\u id
相关联。此关系表需要三列
user_id PK FK to user.user_id
faq_id PK FK to faq.faq_id
vote TINYINT 1 or -1
datestamp TIMESTAMP the time of casting the vote.
请注意,vote
表有一个复合主键。这可以防止用户对常见问题进行多次投票
这样的结构为您提供了非常灵活的报告。例如,此查询将查找过去两天投票最多的常见问题解答
SELECT v.faq_id, SUM(v.vote) votes
FROM vote v
WHERE v.datestamp >= CURDATE() - INTERVAL 2 DAY
GROUP BY v.faq_id
ORDER BY SUM(v.vote) DESC
LIMIT 1
本例为您提供了在过去一周中投下最多反对票的用户
SELECT v.user_id, u.user_name, COUNT(*) downvotes
FROM vote v
JOIN user u ON v.user_id = u.user_id
WHERE v.vote < 0
AND v.datestamp >= CURDATE() - INTERVAL 1 WEEK
GROUP BY v.user_id, u.user_name
ORDER BY COUNT(*) DESC
LIMIT 1
选择v.user\u id、u.user\u name、COUNT(*)下票数
第五票
在v.user\u id=u.user\u id上加入用户u
其中v.vote<0
和v.datestamp>=CURDATE()-间隔1周
按v.user\u id、u.user\u name分组
按计数排序(*)说明
限制1
为什么需要对方法1进行更多查询?使用存储过程,您可以通过一次往返将所有数据传递到MySQL。为什么您认为在这两种情况下会有不同数量的查询?您可以在一个查询中插入多行插入faq_投票值(null,1,1),(null,1,2),(null,1,3)
,并使用联接从两个表中检索数据,不是多个查询。尽管MySQL现在有内置的JSON函数,但有时要做一些普通连接很容易做到的事情确实很复杂。我不认为它很有用。但是,是的,根据你的说法,在这种情况下,什么样的结构才是好的。