Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL数据库列中的数组-或一个键/值的noSQL存储?_Mysql_Database_Performance_Nosql_Scalability - Fatal编程技术网

Mysql SQL数据库列中的数组-或一个键/值的noSQL存储?

Mysql SQL数据库列中的数组-或一个键/值的noSQL存储?,mysql,database,performance,nosql,scalability,Mysql,Database,Performance,Nosql,Scalability,我提前感谢你抽出时间。你的经验分享是无价的 假设有4个用户可以提交帖子并对其他帖子进行投票。在数据库中,在查询执行时间方面,上述哪种方法是最好的?是3列SQL吗 数据库还是2列NoSQL键/值存储 查询示例:获取post_3的投票者 多谢各位 第一种方法(例如MySQL) 第二种方法 编辑(仅基于John Tseng的答案) 我是否应该得出以下结论: 2个表(=3次读取)比从用php处理的一个表中读取长字符串好 我想指出的是,在实施项目之前要优化速度(或者至少要学习如何) 是我觉得重要的事情

我提前感谢你抽出时间。你的经验分享是无价的

假设有4个用户可以提交帖子并对其他帖子进行投票。在数据库中,在查询执行时间方面,上述哪种方法是最好的?是3列SQL吗 数据库还是2列NoSQL键/值存储

查询示例:获取post_3的投票者

多谢各位

第一种方法(例如MySQL)

第二种方法

编辑(仅基于John Tseng的答案)

我是否应该得出以下结论:

2个表(=3次读取)比从用php处理的一个表中读取长字符串好

我想指出的是,在实施项目之前要优化速度(或者至少要学习如何) 是我觉得重要的事情。我不希望我的桌子在将来变成TBs,而且运行缓慢,因为重新设计会有风险,需要大量的工作。我害怕从一张桌子移到另一张桌子。 这就是为什么我要花很多时间为我的数据库找到最佳设计,并从一开始就询问使用键/值存储是否好。我是否误解了键值存储,它们是否在第一台机器上一开始就没有使用

为什么不创建一个逻辑设计,以便在未来轻松优化速度


从您宝贵的回答中,我是否需要了解,良好的SQL数据库设计是唯一的需要,使用键值存储将很容易。

如果您询问这一个查询的查询执行时间,那么它肯定是只需要一次读取的模式(第一种方法)

但是,我不认为这是存储数据的好方法。如果有一天,您想查询:用户3是否对用户1的任何帖子进行投票

我要做两张桌子:

创建表post(post\u id int,author\u id int); 创建表upvote(user\u id int,post\u id int)

这将使您的示例查询变慢,但我认为您不应该优化速度。存储数据的方式非常重要,在优化速度之前,应使其符合逻辑。您将有大量的方法来加快数据库的速度,而无需使用奇怪的方式存储数据

当然,当你每秒收到数千个请求时,你会想做一些非规范化和NoSQL,但我认为你应该在最初的设计中远离这些事情

当人们说NoSQL不能扩展时,他们指的是数据库以TB的顺序,请求以每秒数千次的顺序。几年后,它们将意味着数十TB,每秒一万个请求。使用非常强大的机器,关系数据库每秒可以处理数十TB和一万个请求。再过几年,它就会变得更便宜一些

总之,在关系数据库中进行初始设计,使所有内容规范化。当您开始最大化RAM时(在其他关系数据库优化之后),您可以考虑这些问题

编辑

对于这一查询,从表中读取一行确实更快。然而,一个好的数据库设计应该足够灵活,能够容纳多个查询,而不仅仅是一个查询。在你的情况下,一旦你有成千上万的追随者,甚至数百万的选票,你将有一些严重的问题。要修改单个upvote,需要进行大量处理。要查找任何单个更新,需要解析整个字符串

虽然我从一开始就理解您对优化速度的渴望,但许多人的经验表明,拥有逻辑代码比纯粹以性能指标为中心的代码要好得多。正如我们在这个简短的示例中所看到的,因为您加快了这个查询,所以您大大降低了其他查询的速度

而且,理解SQL结构要比理解NoSQL结构容易得多。在学习NoSQL方法之前,一定要先学习SQL方法。一个原因是NoSQL不是SQL,有很多选择

回到这个特定的查询。有了正确的索引,查询将连续执行三次读取,这与一次读取的性能非常相似。我认为加速这个查询的正确方法不是以笨拙的方式将数据存储在数据库中,而是将笨拙的存储留给缓存层。您可以查询数据库以获得查询的正确答案,然后将其存储在缓存中。每次后续读取都会从缓存中获取数据。缓存将被非规范化,如下所示:

key: Post_3_upvotes value: [1, 3]

这与将所有数据存储在键/值存储中的区别在于,将对关系数据库进行修改,这将有利于修改。同时使用多个用户修改key/value store将使您面临比性能更大的问题。

感谢您为我的问题提供的时间。由于我有一个很长的评论,而且到目前为止我们在这个帖子上有两个人,所以我提供了我的长评论作为编辑。谢谢again@whitelettersandblankspaces我认为考虑一下表现对你有好处。然而,我认为你为此付出了太多的灵活性。我已经编辑了我的答案,包括可能的性能增强。你真的给了我很好的帮助,我根据你的anwser在网上搜索学习。非常感谢,所以我可以从一开始就实现一个内存中的noSQL存储以及SQL结构。对吗?@Whiteletter很高兴知道你觉得我的答案很有帮助。我要说的是,它们是两个不同的数据存储层,一个是真实性的最终来源(关系数据库),另一个是频繁使用的数据的快速存储(缓存)。根据您选择的数据库,我猜
The way you store your data is very important, and you should make it logical before optimizing for speed.
key: Post_3_upvotes value: [1, 3]