2010-11-21 2 views
1

저는 mysql을 데이터베이스로 사용하여 웹 응용 프로그램을 작성하고 있습니다.선택 항목이 많은 소규모 데이터베이스에서 Memcached 혜택

나는 세션을 저장하기 위해 memcached를 사용하고 있는데, (또 다른 memcached 인스턴스에) 데이터베이스 레코드를 저장해야한다고 생각하고있다.

db는 꽤 작아지고 한동안 업데이트 될 것입니다. 우리는 트래픽이 많을 것으로 예상되므로 많은 선택이있을 것입니다.

작은 데이터베이스의 경우 memcached에 레코드를 저장하는 것이 좋을까요, 아니면 mysql 캐시에두고 데이터베이스 연결을 많이 조정해야합니까? (MySQL 최적화를위한 몇 가지 포인터에 감사드립니다)?

감사합니다.

답변

0

왜 벤치 마크를 실행하고 그 부하를 분산시키지 마십시오 !! APC를 사용

http://www.php.net/manual/en/intro.apc.php

Page generated in 0.003202 secs using 2 DB calls and 0 DBCache hits (users ttl=5 countries ttl=5 and both items have expired) 

Page generated in 0.002728 secs using 1 DB calls and 1 DBCache hits (users ttl=5 countries ttl=immortal and users has expired) 

Page generated in 0.000067 secs using 0 DB calls and 2 DBCache hits (users ttl=5 countries ttl=immortal and both are fetched from cache) 

how fast - 0.000067 ouch !! 

샘플 PHP 스크립트

<?php 

require_once "CacheDB.php"; 

ob_start(); 

echo "<h3>APC info:</h3>"; 

print_r(apc_sma_info()); 

try{ 

    //I assume you've already have a db connection available for the cacheDB to use 

    $db = @new mysqli("127.0.0.1","foo_dbo","pass","foo_db",3306); 

    if ($db->connect_errno) 
     throw new Exception("Could not connect: " . $db->connect_error); 

    //start the demo... 

    $startTime = microtime(true); 

    $cacheDB = new CacheDB($db); 

    $rows = $cacheDB->Query("call list_users()", CacheDB::TTL_5); //5 second Time To Live (TTL) (30 secs might be more realistic) 
    if($rows){ 
     echo "<h3>Users:</h3><ul>"; 
     foreach($rows as $row) echo sprintf("<li>%s</li>", $row["username"]); 
     echo "</ul>"; 
    } 

    $rows = $cacheDB->Query("call list_countries()", CacheDB::TTL_IMMORTAL); //never expires 

    if($rows){ 
     echo "<h3>Countries:</h3><ul>"; 
     foreach($rows as $row) echo sprintf("<li>%s</li>", $row["name"]); 
     echo "</ul>"; 
    } 

    echo sprintf("<p><b>Page generated in %s secs using %d DB calls and %d DBCache hits</b></p><p>Refresh me !!</p>", 
      number_format(microtime(true) - $startTime, 6, ".", ""), 
      $cacheDB->GetDBHits(), $cacheDB->GetCacheHits()); 

    $db->close(); 
} 
catch(Exception $ex) 
{ 
    ob_clean(); 
    echo sprintf("zomg borked - %s", $ex->getMessage()); 
} 

//finally 

ob_end_flush(); 

?> 
+0

memcache를 지원 유통 - http://stackoverflow.com/questions/815041/memcached-vs-apc-which-one -should-i- – ajreal

+0

을 선택해야합니다.하지만 비용은 http://www.mysqlperformanceblog.com/2006/09/27/apc-or-memcached/ (당신에 대해 잘 모릅니다. 그러나 저는 속도입니다. 괴물과 그래서 내로드 균형 웹 서버 이상 중복 경우) –

+0

어떻게 보느냐에 따라 APC에 캐시 된 데이터/코드이며 APC를 실행하는 서버에서만 사용할 수 있습니다. memcache를 사용하면서 한 번 실행하고 값을 저장하고 여러 서버에 다시 사용 – ajreal

관련 문제