Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该避免建立MySQL连接(在使用Memcache时)还是无论如何都要建立连接?_Mysql_Optimization_Memcached - Fatal编程技术网

我应该避免建立MySQL连接(在使用Memcache时)还是无论如何都要建立连接?

我应该避免建立MySQL连接(在使用Memcache时)还是无论如何都要建立连接?,mysql,optimization,memcached,Mysql,Optimization,Memcached,所以我刚刚开始使用Memcache。我已经准备好编写一些代码,但是我有一个优化问题: 我想知道我是否应该尽可能延迟建立MySQL连接(当所有东西都可以从Memcache中读取时,可能根本不建立MySQL连接),或者无论如何建立MySQL连接来节省我的编码时间,因为我认为不是连接而是实际的查询让我的服务器的CPU变得疯狂 因此,我必须在这两个代码示例中进行选择: 1-无论如何都要连接到MySQL 2-需要时立即连接到MySQL 方法是只在需要的时候连接mySQL(和其他东西)。这样可以减少应用程序

所以我刚刚开始使用Memcache。我已经准备好编写一些代码,但是我有一个优化问题:

我想知道我是否应该尽可能延迟建立MySQL连接(当所有东西都可以从Memcache中读取时,可能根本不建立MySQL连接),或者无论如何建立MySQL连接来节省我的编码时间,因为我认为不是连接而是实际的查询让我的服务器的CPU变得疯狂

因此,我必须在这两个代码示例中进行选择:

1-无论如何都要连接到MySQL 2-需要时立即连接到MySQL
方法是只在需要的时候连接mySQL(和其他东西)。这样可以减少应用程序所需的资源(在这种情况下是网络连接)。并且您不需要向DB服务器加载


一般经验法则:仅在需要时使用资源。

如果速度很重要,请提前建立连接。这不是一个开放的大资源,但它可能需要一段时间来建立

另外,通过早期连接,您可以在应用程序启动时知道是否存在问题(如数据库服务器关闭),并确认一切正常,而不是在一段时间后泄漏,因为您本可以在问题出现之前就知道并修复问题

您可能希望进一步运行heartbeat查询,以断言数据库仍然存在,原因非常相似


请注意,这种方法使数据库需要启动才能启动应用程序。你可以在两者之间做一些事情:在启动时获得连接,但如果连接不可用,就退回到即时方法,这会给你更多的灵活性。这就是我要做的。

我认为这取决于并发性。但将连接缓存在线程安全池中更好

在许多web应用程序中,建立数据库连接并将其放入线程安全池中,因为建立连接的成本很高


似乎从memcached而不是直接从数据库获取数据,因为它速度更快,可以容纳这么多线程

看看你提供的代码(通常是上世纪风格的意大利面),我会投第一个票。
添加到程序流中的任何逻辑都会使代码复杂度增加十倍。所以,最好让它尽可能简单

或者,我甚至建议不要使用memcache,直到您学会如何分离和封装不同的内容。

特别是因为没有必要缓存可以通过主键从db获取的数据

这种效果并不理想,如果您将数据存储在memcache中,您将至少能够提供站点的只读版本(假设您大部分都有读取),并且只有在完成写入时才会显示错误,这是更可取的。至于站点启动,您应该对服务器进行某种监控。
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("MEMCACHE: Could not connect!");
$db = mysql_connect('localhost', 'user', 'password') or die ("MySQL: Could not connect!");
mysql_select_db('database');

$sql = "SELECT id FROM table LIMIT 1";
$key = md5('query'.$sql);
//lookup value in memcache
$result = $memcache->get($key);
//check if we got something back
if($result == null) {
//fetch from database
$qry = mysql_query($sql) or die(mysql_error()." : $sql");
if(mysql_num_rows($qry)> 0) {
    $result = mysql_fetch_object($qry);
    //store in memcache for 60 seconds
    $memcache->set($key,$result,0,60);
   }
}
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("MEMCACHE: Could not connect!");

$sql = "SELECT id FROM table LIMIT 1";
$key = md5('query'.$sql);
//lookup value in memcache
$result = $memcache->get($key);
//check if we got something back
if($result == null) {

if(!$db){
    $db = mysql_connect('localhost', 'user', 'password') or die ("MySQL: Could not connect!");
    mysql_select_db('database');
}

//fetch from database
$qry = mysql_query($sql) or die(mysql_error()." : $sql");
if(mysql_num_rows($qry)> 0) {
    $result = mysql_fetch_object($qry);
    //store in memcache for 60 seconds
    $memcache->set($key,$result,0,60);
   }
}