codeigniter中的多个连接非常慢-如何加速

yfwxisqw  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(397)

我使用的是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 在我得到数据后,但可能不得不再次打开它)。
我发现这很慢;我怎样才能加快速度?

093gszye

093gszye1#

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

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

然后在一个query()调用中执行它。
问题不在于codeigniter,而是执行n行插入与执行n行中的一行插入相比开销太大。

iyzzxitl

iyzzxitl2#

使用foreach将多个insert替换为批插入
foreach($sqls as$sql){$this->target->cnx->query($sql);}//替换为
$this->db->insert\u batch('mytable',$data);注意数据是数组[],[],[]…[]的数组或类似这样的窗体查询
insert into mytable(title,name,date)值('my title','my name','my date'),('other title','other name','other date')

相关问题