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

时间:2018-06-27 15:23:20

标签: mysql codeigniter-3

我正在使用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,但可能不得不再次打开它)。

我发现这很慢;我如何加快速度?

2 个答案:

答案 0 :(得分:0)

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

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

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

问题不是Codeigniter,而是执行n INSERT的开销要比对N行执行一次INSERT的开销大。

答案 1 :(得分:0)

  • 使用foreach将多个插件替换为批量插件

    foreach($ sqls为$ sql){         $ this-> target-> cnx-> query($ sql);     } //用

  • 替换

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

插入mytable(标题,名称,日期)VALUES(“我的标题”,“我的名字”,“我的日期”),(“另一个标题”,“另一个名称”,“另一个日期”)