存储不变数据的最佳方式

时间:2013-08-04 05:30:05

标签: php mysql

当我处理我的游戏时,我一直在使用MySQL数据库。

但是最近我在Memcache中放了很多SELECT个结果,因为它们不太可能改变。

这让我想知道,仅仅拥有一个定义数据数组的PHP文件会不会更好?当然,这意味着我必须加载整个数组只是为了访问一行,但我相信与无需等待MySQL的时间相比,这是微不足道的。

我是否正确思考这条道路?我应该将我不变的游戏数据(例如角色基础统计数据,兼容性图表,项目数据等)移动到PHP文件中吗?或者我应该继续使用MySQL + Memcache吗?

哪个更好,为什么?

2 个答案:

答案 0 :(得分:6)

似乎有些基准是有序的。

我整理了几个脚本来测试将数据存储为PHP数组,CSV文件以及通过PDO访问的MySQL数据库。

阵列测试

以下是阵列测试的脚本:

阵列inc.php:

$data = array(
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    )
);

阵列test.php的

$start = microtime( TRUE );

for( $i = 0; $i < 10000; ++$i ) {
    include( "array-inc.php" );
    $retrieve = $data[2];
}

$finish = microtime( TRUE );

print $finish - $start;

CSV测试

以下是CSV测试的脚本:

values.csv:

key,value
something,something else
something,something else
something,something else
something,something else
something,something else

csv.php:

$start = microtime( TRUE );

for( $i = 0; $i < 10000; ++$i ) {
    $fp = fopen( "values.csv", "r" );

    $data = array();
    while(( $line = fgetcsv( $fp )) !== FALSE ) {
        $data[] = $line;
    }

    $retrieve = $data[2];
}

$finish = microtime( TRUE );

print $finish - $start;

MySQL测试

这是MySQL测试的脚本(该表有一个id,key和value列,其中包含与上述两行相同的五行和值):

mysql.php:

$start = microtime( TRUE );

for( $i = 0; $i < 10000; ++$i ) {
    $query = "SELECT * FROM `values` WHERE id = :id";
    $result = $pdo->prepare( $query );
    $result->execute( array( ":id" => 2 ));
    $retrieve = $result->fetch( PDO::FETCH_ASSOC );
}

$finish = microtime( TRUE );

print $finish - $start;

这些中的每一个都设置为从存储的数据中访问一个元素,并循环过程10,000次,以便可以更准确地测量时间。结果如下:

我将这些测试中的每一个都运行了三次,并收到以下值:

  • 阵列:
    • 1.050,1.020,1.114秒
  • CSV:
    • 1.264,1.232,1.105秒
  • MySQL的:
    • 1.038,1.149,1.171秒

似乎CSV是明显的输家,但Array与MySQL非常接近,Array可能在性能方面略有领先。您可以随意调整上面的代码,以提供更符合您环境的结果。

答案 1 :(得分:0)

您的问题的答案是针对特定问题的。这是性能,内存和可维护性之间的权衡。即使您想为候选解决方案命名缺点和专业人员,您也需要假设一些参数。以下是影响您将做出决定的参数:

  1. 数据大小:您拥有的数据总大小是多少。即您的数据库文件大小。

  2. 请求加载数据所需的内存平均大小:考虑上面提到的参数和平均并发请求数,需要多少内存。

  3. 每个请求所需的总数据的平均比率:每次加载数据时,您将使用多少数据以及选择这部分数据的容易程度。

  4. 从整个集合中提取数据的目标部分需要多少(CPU)时间:从简单的PHP数组到MySQL SELECT查询,它可能有很大差异。

  5. 了解这些参数,您可以询问一个解决方案是更好还是另一个解决方案的问题。无论如何,您的解决方案将是以下之一:

    • 包含在代码中。
    • 配置文件(XMLINICSVJSON等。)。
    • 数据库服务器(MySQL)。
    • 本地数据库(SQLite)。
    • 缓存在内存中(缓存服务器,如memcached,或PHP's shared memory)。

    我知道我没有回答你的问题,但那是因为除非你指定上述参数,否则不可能回答它。