2011-02-14 169 views
4

我目前使用很多perl二进制散列文件存储在多个文件位置用于加载数据到这个cgi网站。我在辩论如果我决定在那里存储数据,mySQL会更快还是更慢。访问速度,perl二进制散列文件与mySQL

任何见解?我知道perl哈希完全加载到内存中。

戈登

+1

“二元散列文件”是什么意思?你是否使用类似[DB_File](http://search.cpan.org/perldoc?DB_File)的连结哈希? – cjm 2011-02-14 22:49:56

+1

注意'开箱即用'MySQL通常对非常旧的硬件具有默认配置设置,并且可以大幅调整到高速缓存中大多数数据站点的位置。我正在查看我最近在deb6上安装的mysql 5.1。开放评论“以下值假设你至少有32M RAM”!在线文档稍微好一些,但仍然过了几年:http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html – dwarring 2011-02-14 23:40:59

+0

@snoopy:也许它是“几年过时“是因为你正在查看MySQL 5.0文档。尝试将URL从5.0更改为5.5,以获得更新的内容:http://dev.mysql.com/doc/refman/5.5/en/server-parameters.html – 2011-02-15 10:21:39

回答

8

使用数据库意味着你的查询会慢一些,但你的脚本将使用较少的内存。

使用内存哈希表示您的查找速度会更快,但脚本将使用更多的内存。

如果你没有内存问题,你的哈希将永远不会变大,那么继续使用它们。

如果你没有内存问题,并且你的哈希将变得更大,然后使用数据库来看看。

如果您遇到内存问题,请使用数据库。

如果你想使用数据库为了使用数据库(即学习新技能),然后使用数据库。

2

如果Perl哈希处理您的数据需求,那么您可能不需要完整SQL数据库的开销。对于键值存储有很多存储选择,例如Berkley DB和整个“NOSQL”运动。谷歌这些,你会发现很多信息。 CPAN中有很多Perl接口。

1

严格地讲,就速度而言,在直接内存中哈希中找到单个完全匹配的密钥与您可以获得的一样好,除非您的数据可以放入数组。 (即,它将仅由一系列数字键进行访问,这些数字键形成从0开始的大部分连续范围。)

如果您有多个可能需要搜索的键(例如,名称和员工ID),或者如果您需要进行不完全基于平等的搜索(例如,“查找带有姓氏的所有员工'Smith'”),那么您将因搜索需求而显着减慢散列键和数据库开始看起来好多了。

整体性能的另一个因素是,你提到你的哈希是“存储在多个文件位置”。如果你只做一个或几个查找,那么从这些文件中读取哈希到内存中也需要花费时间,这又会倾向于使用数据库,这将最大限度地减少从磁盘读取的不需要的数据量。

因此,这取决于您需要如何访问您的数据和访问模式。

0

除了已经提到的内容之外,您将获得数据库的更多可扩展性,因为它可以卸载到另一台服务器。多年来,MySQL一直致力于更快速地进行复杂的查询,这是您不必编写的代码。使用二进制散列,您可以担心在不降低应用程序速度的情况下同步到磁盘,确保在多个进程一次访问数据时确保磁盘写入的原子性,维护和优化以及处理同步。使用数据库为您处理所有这些问题。

在等式的另一端,数据库意味着额外的I/O延迟,因为发送查询并通过网络或本地套接字接收结果。不要低估你可以在这里度过的时间,特别是随着你的数据集的增长。

在散列驱动程序上编写通用API通常是一个好主意。然后,当可伸缩性或并发性成为问题时,您可以添加MySQL驱动程序并迁移您的数据。诚然,这是一个很大的“公正”,但它是一种快速而简单的方法,可以在需要更改时限制对软件其余部分的影响