Рубрики
Uncategorized

Четыре метода массовой вставки данных MySQL

Автор оригинала: David Wong.

Четыре метода массовой вставки данных MySQL

Способ 1: Циклическая вставка

Это также самый распространенный способ, если объем данных не очень велик, вы можете его использовать, но каждый раз вам нужно потреблять ресурсы для подключения к базе данных. Общее мышление таково (я пишу здесь псевдокод, который может быть написан в сочетании с моей собственной бизнес-логикой или грамматикой фреймворка)

for($i=1;$i<=100;$i++){
    $sql = 'insert...............';
    //querysql
}
foreach($arr as $key => $value){
$sql = 'insert...............';
    //querysql
}
while($i <= 100){
$sql = 'insert...............';
    //querysql
    $i++
}

Потому что это слишком распространено, это не слишком сложно, и это не моя главная работа сегодня, поэтому я не буду здесь много говорить.

Способ 2. Сократите ресурсы подключения и соедините SQL

Псевдокод выглядит следующим образом

// Assuming arr keys are synchronized with database fields, this is how most frameworks are designed when PHP operates on databases.
$arr_keys        = array_keys($arr);
$sql             = 'INSERT INTO tablename (' . implode(',' ,$arr_keys) . ') values';
$arr_values      = array_values($arr);
$sql             .= " ('" . implode("','" ,$arr_values) . "'),";
$sql             = substr($sql ,0 ,-1);
// After splicing, it's probably INSERT INTO tablename ('username','password') values 
('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx')
.......
//querysql

Написать 10 000 обычных вставок не составляет большой проблемы, если только данные не очень длинные, этого достаточно для обычных пакетных вставок, таких как пакетная генерация номеров карт, пакетная генерация случайных кодов и так далее.

Способ 3. Используйте хранимые процедуры

Это именно то, что у меня есть в руках, чтобы использовать это для оплаты sql, конкретной бизнес-логики, которую вы можете объединить самостоятельно.

delimiter $$$
create procedure zqtest()
begin
declare i int default 0;
set i=0;
start transaction;
while i<80000 do
    //your insert sql 
set i=i+1;
end while;
commit;
end
$$$
delimiter;
call zqtest();

Это всего лишь тестовый код, конкретные параметры определяются вами. Я вставляю 80 000 фрагментов за раз, хотя и немного, но каждый фрагмент данных очень большой, есть много переменных 4000 и текстовых полей. Отнимает 6,524 секунды

Метод 4: Использование MYSQL LOCAL_INFILE

В настоящее время я использую это, так что, кстати, код PDO также дублируется для вашей справки.

// Set PDO to open MYSQL_ATTR_LOCAL_INFILE
/*[email protected]
public function pdo_local_info ()
{
     global $system_dbserver;
     $dbname  = '[email protected]';
     $ip      = '[email protected]';
     $user    = '[email protected]';
     $pwd     = '[email protected]';
     $dsn     = 'mysql:dbname=' . $dbname . ';host=' . $ip . ';port=3306';
     $options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true];
     $db      = new PDO($dsn ,$user ,$pwd ,$options);
     return $db;
 }
// The pseudocode is as follows
public function test(){
     $arr_keys         = array_keys($arr);
     $root_dir         = $_SERVER["DOCUMENT_ROOT"] . '/';
     $my_file          = $root_dir . "[email protected]/sql_cache/" . $order['OrderNo'] . '.sql';
     $fhandler         = fopen($my_file,'a+');
     if ($fhandler) {
        $sql = implode("\t" ,$arr);
          $i   = 1;
          while ($i <= 80000)
          {
              $i++;
              fwrite($fhandler ,$sql . "\r\n");
          }
          $sql = "LOAD DATA local INFILE '" . $myFile . "' INTO TABLE ";
          $sql .= "tablename (" . implode(',' ,$arr_keys) . ")";
          $pdo = $this->pdo_local_info ();
          $res = $pdo->exec($sql);
          if (!$res) {
               // TODO insertion failure
          }
          @unlink($my_file);
      }
}

Это также большой объем данных с переменной 4000 и текстовыми полями. Время, затрачиваемое на 2,160 с Вышесказанное отвечает основным потребностям. Один миллион данных-это не большая проблема. В противном случае данные слишком велики и включают вставку субданных, подтаблиц или очередей.

Вы могли бы сказать, что вставка кода не работает? Мой псевдокод говорит только о том, что мышление имеет свой собственный способ мышления.