2008-11-02 59 views
1

我正在构建英文网络词典,用户可以在其中键入单词并获取定义。我想了一会儿,因为数据是100%静态的,而且我一次只检索一个单词,我最好使用文件系统(ext3)作为数据库系统,而不是选择使用MySQL来存储定义。考虑到你必须连接到MySQL,而且本身是一个非常缓慢的操作,我认为会有更少的开销。使用文件系统VS RDMBS进行并发处理(MySQL)

我的恐惧是,如果我的系统受到轰炸,比如说500个字的检索次数/秒,我仍然会更好地使用文件系统作为数据库吗?或者增加的文件系统读取会妨碍性能,而不是MySQL可能在底层做的事情?

当前层次结构按单词的第一个字母,第二个字母和第三个字母分段。因此,如果您要搜索“水”的定义,脚本(PHP)将尝试从“../dict/w/a/t/water.word”中读取(在清理了有问题的字符和降低它)

我正在朝着正确的方向吗?还是有更快的解决方案(不包括使用类似memcached的内存存储定义)?在任何目录因素中存储的文件数量是否会影响性能?我应该存储在一个目录中的文件数量的基准是多少?

回答

1

字典需要的查找类型正是数据库擅长的。我认为你描述的文件系统方法是行不通的。不要太难!使用数据库。

0

数据库听起来非常适合您的需求。 我也不明白为什么memcached是相关的(你的数据有多大?不能超过几个GB ...对吧?)

1

你可以保持一个连接池来加速连接到D B。

此外,如果此应用程序需要扩展到多个服务器,则文件系统在服务器之间共享可能会非常棘手。

所以,我第三个建议。使用数据库。

但除非它是一个令人难以置信的大字典,缓存将意味着你几乎alwys正从本地存储的东西,所以我不认为这会成为你的应用程序:)

0

的最大的问题数据大约是几GB。我的目标是速度,速度和速度(定义将使用XHR加载)。我说的数据是静态的,永远不会改变,并且在任何情况下,我都不会为每个请求使用除单个读取操作之外的任何内容。所以我很难确信使用MySQL及其所有的膨胀。

使用这种策略,文件系统或MySQL会在高负载下首先失败吗?至于缩放复制是答案,因为数据永远不会改变,只有几GB。

2

您认为该决定对解决方案的整体性能有影响的理由是什么?它除了提供定义之外还有什么作用?

无论如何你是否有MySQL作为解决方案的一部分,或者如果你选择它作为解决方案,你需要添加它吗?

定义的权威来源在哪里? (可能是复制的)文件系统或脱机DB?

看来喜欢的事,应该是在一个数据库体系结构 - 文件系统是一个陌生的地方来映射大量名目的值

(这是由你的文件系统结构摔东西下降首字母证明)如果它在数据库中,回答问题如“有多少个定义?”要容易得多,但如果你不关心你的应用程序的这种情况,这可能无关紧要。

因此,在某种程度上,这种感觉好像在寻求对性能不会对整体解决方案产生太大影响的性能进行超级优化。

我是“让它正确,然后快速”的粉丝,“正确”将更直接地用数据库来实现。

当然,最终的答案是尝试两种方式,看看哪一种最适合您的情况。

Paul

0

让它工作第一。过早优化是不好的。

使用数据库可以更轻松地重构模式,而且您不必编写基于索引的查找的实现,而实际上这种查找实际上并不重要。

说连接数据库“是一个非常缓慢的操作”夸大了问题。实际上,连接不需要很长时间,而且您可以重复使用连接。

如果您担心读取缩放,1G数据库非常小,因此您可以将它的只读副本推送到每个Web服务器,并且它们都可以从其本地副本读取。只要写入保持在不影响读取性能的级别,即可提供几乎完美的可读性。另外,1G的数据很容易放入ram中,所以你可以在启动时将整个数据库加载到内存中(在该节点通告负载均衡器之前),从而使其速度更快。

每秒500次查询非常小。也许,我会开始担心每个服务器每秒5000个。如果你不能在现代硬件上实现每秒5000次密钥查找(从一个适合于RAM的数据库?!!),那么你的实现会出现严重错误。

0

同意这是不成熟的优化,并且MySQL对于这种用例肯定会有足够的性能。我必须补充你也可以使用基于文件的数据库,就像非常快速的Tokyo Cabinet作为妥协。可悲的是,它没有PHP绑定,所以你可以使用它的祖父DBM

也就是说,不要使用文件系统,就我所见,没有什么好的理由。

0

在您的内存中使用虚拟驱动器(谷歌它如何为您的发行版),或者如果您的数据是由PHP提供的使用APC,memcache可能与MySQL工作。就我个人而言,我不认为你在这里做的优化是你应该花费时间的地方。 500秒的请求量非常大,我认为使用mysql可以为您提供更好的后续功能。如果你想让自己与竞争对手脱颖而出,我认为你需要专注于功能,而不是速度。另外还有一些关于网络用户界面的好消息,服务器速度只是整个图片的一小部分。

好运

0

你也可以想想一个没有SQL数据库(如了Riak,蒙戈,甚至Redis的)这样的事情。它们都非常快,并且可以帮助您进行复制。在这种情况下,Mysql可能会被过度杀死并且难以扩展,但其他的则有一些强大的工具