несколько соединений в CodeIgniter очень медленные - как ускорить - PullRequest
0 голосов
/ 27 июня 2018

Я использую 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 голосов
/ 27 июня 2018
  • Замените несколько вставок, используя foreach, в пакетную вставку

    foreach ($ sqls как $ sql) { $ This-> target-> cnx-> запрос ($ SQL); } // заменим его на

$ this-> db-> insert_batch ('mytable', $ data); данные примечания - это массив массивов [[], [], [] ... []] или запрос формы, как это

INSERT INTO mytable (название, имя, дата) VALUES («Мое имя», «Мое имя», «Моя дата»), («Другое название», «Другое имя», «Другая дата»)

0 голосов
/ 27 июня 2018

Измените свой код, чтобы получить одну строку вставки, такую ​​как

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

Затем выполните его в одном запросе ().

Проблема не в Codeigniter, а в слишком больших затратах при выполнении n INSERT по сравнению с выполнением одной INSERT из N строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...