CodeIgniter 中的多个连接非常慢 - 如何加快速度

问题描述 投票:0回答:2

我正在使用 CodeIgniter 3,这里是有问题的代码:

//now transfer data - this only works for very small to medium tables
$all = 'SELECT * FROM `'.$sourceServer['database'].'`.`'.$table.'`';
if($data = $this->source->cnx->query($all)){
    $sqls = [];
    foreach($data->result_array() as $v){
        $sql = 'INSERT INTO `'.$targetServer['database'] . '`.`' . $targetTable . '` SET ';
        foreach($v as $o => $w){
            $sql .= "\n\t`" . $o . '`=' .
                (is_null($w) ? '' : "'") .
                (is_null($w) ? 'NULL' : str_replace("'", "\\'", $w)) .
                (is_null($w) ? '' : "'") . ',';
        }
        $sqls[] = rtrim($sql, ',');
    }
    foreach($sqls as $sql){
        $this->target->cnx->query($sql);
    }
}

请注意,

$this->target->cnx..
$this->source->cnx..
是实例化的 CI 连接,但很可能位于网络上的两个不同物理服务器上。

此外,两个连接在整个处理过程中都是打开的,因为我可能想稍后执行其他跨网络操作(我可以在获取数据后关闭

$this->source->cnx
,但可能必须再次打开它)。

我发现这很慢;我怎样才能加快速度?

php mysql codeigniter-3
2个回答
0
投票
  • 使用 foreach 将多个插入替换为批量插入

    foreach($sqls as $sql){ $this->目标->cnx->查询($sql); } //替换为

$this->db->insert_batch('mytable', $data); 注意数据是数组 [[],[],[]...[]] 的数组 或像这样形成查询

INSERT INTO mytable (title, name, date) VALUES ('我的标题', '我的名字', '我的日期'), ('另一个标题', '另一个名字', '另一个日期')


0
投票

修改您的代码以获得一个插入字符串,例如

INSERT INTO table (col1,....coln) VALUES
(val11,....val1n),
....
(valn1,....valnn);

然后在一次 query() 调用中执行它。

问题不在于 Codeigniter,而是与执行 N 行的 1 个 INSERT 相比,执行 n 个 INSERT 的开销太大。

© www.soinside.com 2019 - 2024. All rights reserved.