在我开发游戏时,我一直在使用 MySQL 数据库。
但最近我SELECT在 Memcache 中放了很多结果,因为它们不太可能改变。
这让我想知道,只有一个定义数据数组的 PHP 文件不是更好吗?当然,这意味着我必须加载整个数组才能访问一行,但我相信与不必等待 MySQL 所节省的时间相比,这微不足道。
我在这条思路上是否正确?我应该将我不变的游戏数据(例如角色基础统计、兼容性图表、项目数据等)移动到 PHP 文件吗?还是我应该继续使用 MySQL+Memcache?
哪个更好?为什么?
似乎有些基准是有序的。
我整理了一些脚本来测试将数据存储为 PHP 数组、CSV 文件以及通过 PDO 访问的 MySQL DB。
阵列测试
以下是数组测试的脚本:
数组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 测试的脚本:
值.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 次,以便更准确地测量时间。结果如下:
我将这些测试中的每一个运行了 3 次,并收到以下值:
看起来 CSV 显然是输家,但 Array 和 MySQL 非常接近,而 Array 可能在性能上略有领先。随意调整上面的代码以提供更符合您的环境的结果。
您的问题的答案是针对特定问题的。这是性能、内存和可维护性之间的权衡。即使您想说出候选解决方案的优缺点,您也需要假设一些参数。以下是影响您做出决定的参数:
数据大小:您拥有的数据的总大小。即您的数据库文件大小。
请求加载数据所需的平均内存大小:考虑上述参数和平均并发请求数,它们需要多少内存。
每个请求所需的总数据的平均比率:每次加载数据时,您将使用多少数据以及选择这部分数据的难易程度。
从总集合中提取目标数据部分需要多少(CPU)时间:从简单的 PHP 数组到 MySQLSELECT查询,它可能会有很大的不同。
了解这些参数后,您就可以提出一个解决方案是否更好的问题。无论如何,您的解决方案将是以下之一:
XML、INI、CSV等JSON)。MySQL)。SQLite)。memcached,或者可能PHP是共享内存)。我知道我没有回答您的问题,但那是因为除非您指定提到的参数,否则无法回答。