簡體   English   中英

存儲不變數據的最佳方式

[英]Best way to store unchanging data

當我處理我的游戲時,我一直在使用MySQL數據庫。

但是最近我在Memcache中放了很多SELECT結果,因為它們不太可能改變。

這讓我想知道,僅僅擁有一個定義數據數組的PHP文件會不會更好? 當然,這意味着我必須加載整個數組只是為了訪問一行,但我相信與無需等待MySQL的時間相比,這是微不足道的。

我是否正確思考這條道路? 我應該將我不變的游戲數據(例如角色基礎統計數據,兼容性圖表,項目數據等)移動到PHP文件中嗎? 或者我應該繼續使用MySQL + Memcache?

哪個更好?為什么?

似乎有些基准是有序的。

我整理了一些腳本來測試將數據存儲為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. 數據大小:您擁有的數據總大小是多少。 即您的數據庫文件大小。

  2. 請求加載數據所需的平均內存大小:考慮上面提到的參數和平均並發請求數,需要多少內存。

  3. 每個請求所需的總數據的平均比率:每次加載數據時,您將使用多少數據以及選擇這部分數據的容易程度。

  4. 從總集中提取數據的目標部分需要多少(CPU)時間:從簡單的PHP數組到MySQL SELECT查詢,它可以有很大的不同。

了解這些參數后,您可以詢問一個解決方案是更好還是另一個解決方案。 無論如何,您的解決方案將是以下之一:

  • 包含在代碼中。
  • 配置文件( XMLINICSVJSON等)。
  • 數據庫服務器( MySQL )。
  • 本地數據庫( SQLite )。
  • 緩存在內存中(緩存服務器,如memcached ,或者PHP的共享內存 )。

我知道我沒有回答你的問題,但那是因為除非你指定上述參數,否則不可能回答它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM