什么是更快,更平的文件或MySQL RAM数据库?

时间:2009-09-17 18:21:51

标签: php sql mysql performance flat-file

我需要一种简单的方法来运行多个PHP脚本来共享数据。

我应该创建一个带有RAM存储引擎的MySQL数据库,并通过它共享数据(多个脚本可以同时连接到同一个数据库吗?)

或者每行一个数据的平面文件会更好吗?

8 个答案:

答案 0 :(得分:13)

平面文件? Nooooooo ...

使用一个好的数据库引擎(MySQL,SQLite等)。然后,为了获得最佳性能,请将memcached用于缓存内容。

<小时/> 通过这种方式,您可以使用经过验证的处理并发性的服务器软件等在进程之间共享数据的简易性和可靠性......但是您可以快速缓存数据。

请记住以下几点:

  1. MySQL有一个查询缓存。如果您反复发出相同的查询,则无需添加缓存层即可获得大量性能。
  2. 无论如何,MySQL真的很快。您是否经过了负载测试以证明它不够快?

答案 1 :(得分:6)

请不要使用平面文件,以保证维护者的理智。

如果您只想尽快获得共享数据,并且可以将其全部保存在RAM中,那么memcached就是完美的解决方案。

如果您想要持久化数据,那么请使用DBMS,如MySQL。

答案 2 :(得分:2)

通常,数据库更好,但是,如果您共享一个小的,大部分是静态的数据量,那么使用平面文件执行它可能会带来性能优势(和简单性)。

除了琐碎的数据共享之外的任何东西,我会选择一个DB。

答案 3 :(得分:2)

1-平面文件有用的地方: 平面文件可以比数据库更快,但在非常特定的应用程序中。 如果从头到尾读取数据而不进行任何搜索或写入,它们会更快。 如果数据不适合内存并且需要完全读取以完成工作,那么它“可以”比数据库更快。另外如果写入比读取多得多,平面文件也会大放异彩,大多数默认数据库设置都需要使读取查询等待写入完成以便维护索引和外键。使写查询通常比简单读取慢。

TD / LR版本: 将平面文件用于基于作业的系统(Aka,简单日志解析),而不是用于Web搜索查询。

2-平面文件陷阱:   如果您使用平面文件,则需要在使用自定义锁定机制更改文件时同步脚本。如果你有一个错误,这可能导致减速,腐败直至死锁。

基于3-Ram的数据库? 大多数数据库都有内存缓存用于查询结果,搜索索引,这使得它们很难被平面文件击败。因为它们在内存中缓存,使其完全从内存运行,大部分时间都是无效且危险的。最好正确调整数据库配置。

如果您希望使用ram优化性能,我首先会看到运行您的php scrips,html页面和ram驱动器中的小图像。缓存机制更可能是粗糙的,并且系统地针对不变的静态数据点击硬盘驱动器。

使用负载均衡器可以实现更好的结果,使用背板连接进行集群,直到基于ram的SAN阵列。但那是另一个话题。

5-多个脚本可以同时连接到同一个DB吗?

是的,它叫做连接池。在php(客户端)它的功能是打开一个连接mysql-pconnect(http://php.net/manual/en/function.mysql-pconnect.php)。 你可以在php.ini中配置最大的开放连接。 mysql服务器端的类似设置定义了/etc/mysql/my.cnf中最大并发客户端连接。

你必须这样做才能利用cpu的并行处理,并避免php脚本等待对方查询完成。它在重负载下大大提高了性能。

Apache配置中还有一个用于常规Web客户端的连接池/线程池。请参阅httpd.conf。

对不起文字墙,很无聊。 路易。

答案 4 :(得分:1)

如果你在多台服务器上运行它们,基于文件系统的方法不会削减它(除非你有一个一致的共享文件系统,这不太可能,也可能不可扩展)。

因此,您无论如何都需要基于服务器的数据库,以允许在Web服务器之间共享数据。如果您对性能或可用性非常认真,那么您的应用程序将支持多个Web服务器。

答案 5 :(得分:0)

我会说除非你有一些机制来处理平面文件上的锁(以及一些控制访问的方法),否则MySql DB会是更好的选择。在这种情况下,DB层(无论特定的DBMS如何)充当间接层,让您不必担心。

由于OP没有指定Web服务器(并且PHP实际上可以从命令行运行),所以我不确定缓存技术是否是他们在此之后所做的。 OP可能希望进行某种非网站驱动的飞行数据转换。谁知道呢。

答案 6 :(得分:0)

如果您的系统有一个PHP缓存(将已编译的PHP代码缓存在内存中,如APC),请尝试将您的数据作为PHP代码放入PHP文件中。如果必须写数据,则存在一些安全问题。

答案 7 :(得分:0)

  

我需要一种简单的多重方式   运行PHP脚本来共享数据。

APC和memcached都是很好的选择,具体取决于上下文。 shared memory也可能是一种选择。

  

我应该创建一个带RAM的MySQL数据库   存储引擎,并通过分享数据   那个(多个脚本可以连接到   同时使用相同的DB?)

这也是一个不错的选择,但可能不会像APC或memcached那么快。

  

或者用一块平面文件   每行数据更好?

如果这是只读数据,则可能 - 但可能比上述任何选项都慢。特别是如果数据很大。但是,不要编写自定义解析代码,而应考虑简单地构建PHP数组,并包含()文件。

如果这是一个可以由多个作者同时访问的数据存储区,请务必使用平面文件!从多个进程写入平面文件可能会导致文件损坏。您可以锁定该文件,但存在锁定争用问题和长锁定等待时间的风险。

处理并发写入是mysql和memcached等应用程序存在的原因。