Laravel 4.2:使用外部MySQL服务器时查询速度慢

时间:2014-09-27 12:53:39

标签: php mysql laravel pdo

当MySQL在应用程序之外的另一台服务器上时,查询速度非常慢。它与预期的延迟(网络瓶颈等)无关;我使用Codeigniter时从未遇到过这个问题。它也不像DNS问题,我在我测试过的每个流浪汉机器和服务器上都遇到过这个问题。

试图弄清楚发生了什么我写了一个简单的测试,运行相同的查询,但使用不同的方法:

  1. 使用DSN
  2. 手动创建PDO实例
  3. PDO实例由DB::getPdo()
  4. 返回
  5. 查询构建器
  6. 包含测试结果的屏幕截图:here

    这是代码:

    Route::get('/test', function(){
    
    
        $num_queries = 10;
    
    
        // manually creating a PDO instance with DSN
        Debugbar::measure('$dbh = new PDO("mysql:host=$hostname;port=$port;dbname=$db", $username, $password)', function() use ($num_queries){
    
            $hostname = Config::get('database.connections.mysql.host');
            $port = Config::get('database.connections.mysql.port');
            $db = Config::get('database.connections.mysql.database');
            $username = Config::get('database.connections.mysql.username');
            $password = Config::get('database.connections.mysql.password');
    
            $dbh = new PDO("mysql:host=$hostname;port=$port;dbname=$db", $username, $password);
    
            for($i = 1; $i <= $num_queries; $i++)
            {
                $sth = $dbh->prepare("SELECT * FROM users WHERE id = ?");
                $sth->execute(array($i));
                $sth->fetch(PDO::FETCH_ASSOC);
            }
        });
    
    
        // using DB::getPdo()
        Debugbar::measure('$dbh = DB::getPdo();', function() use ($num_queries){
    
            $dbh = DB::getPdo();
    
            for($i = 1; $i <= $num_queries; $i++)
            {
                $sth = $dbh->prepare("SELECT * FROM users WHERE id = ?");
                $sth->execute(array($i));
                $sth->fetch(PDO::FETCH_ASSOC);
            }
        });
    
    
        // using the query builder
        Debugbar::measure('Query builder', function() use ($num_queries){
    
            for($i = 1; $i <= $num_queries; $i++)
            {
                DB::table('users')->where('id', $i)->get();
            }
        });
    
        return "<h1>$num_queries ".($num_queries == 1 ? 'query' : 'queries')."</h1>";
    });
    

    请注意DB::getPdo()多个查询的缩放程度。有人经历过这个吗?这里发生了什么?我应该指出,当MySQL数据库与应用程序位于同一服务器上时,我不会遇到这些问题。

1 个答案:

答案 0 :(得分:0)

静态调用使用相同的PDO实例,因此每次都在幕后使用相同的实际数据库连接。

其他人每次都会创建一个新的连接,并带来相关的开销。

慢查询将是其他内容的结果(可能是生产中的索引 - 使用EXPLAIN调试查询)。

这些调试测试正在引导你走错路。