1. 程式人生 > 程式設計 >PHP優化之批量操作MySQL例項分析

PHP優化之批量操作MySQL例項分析

本文例項講述了PHP優化之批量操作MySQL。分享給大家供大家參考,具體如下:

設計一個數據表如下:

create table optimization(
  id INT NOT NULL AUTO_INCREMENT,value VARCHAR(10) NOT NULL,PRIMARY KEY(id)
);

現在有一個業務需求需要批量插入資料。

先來看看下面這一段程式碼:

<?php
  $dsn = 'mysql:dbname=test;host=127.0.0.1';
  $user = 'root';
  $password = 'root';

  try {
    $dbh = new PDO($dsn,$user,$password);
  } catch(PDOException $e) {
    echo 'Connection failed: ',$e->getMessage();
  }
  $begin = microtime(true) * 1000;

  $count = 100;
  $stmt = $dbh->prepare('INSERT INTO `optimization` (id,value) VALUES(:id,:value)');
  $stmt->bindParam(':id',$id);
  $stmt->bindParam(':value',$value);
  for ($i = 0; $i < $count; $i++)
  {
    $id = '';
    $value = $i;
    $stmt->execute();
  }

  $end = microtime(true) * 1000;
  echo 'excuted : ',($end - $begin),' ms';

經過測試,上面程式碼執行結果如下:

1、excuted : 7601.4348144531 ms

2、excuted : 7476.4270019531 ms

3、excuted : 7674.4387207031 ms

平均:7584.100179036433 ms

再來看看第二段程式碼:

<?php
  $dsn = 'mysql:dbname=test;host=127.0.0.1';
  $user = 'root';
  $password = 'root';

  try {
    $dbh = new PDO($dsn,$e->getMessage();
  }

  $begin = microtime(true) * 1000;
  $dbh->beginTransaction();
  try {
    $count = 100;
    $sql = 'INSERT INTO `optimization` (id,value) VALUES ';
    $sql_arr = array();
    $sql_str = '';
    for ($i = 0; $i < $count; $i++)
    {
      $sql_arr[] = ("('',$i)");
    }
    $sql_str = implode(',',$sql_arr);
    $sql .= $sql_str;
    $stmt = $dbh->prepare($sql);
    $stmt->execute();
    $dbh->commit();
  } catch(Exception $e) {
    $dbh->rollBack();
    echo $e->getMessage() . '<br>';
  }

  $end = microtime(true) * 1000;
  echo 'excuted : ',' ms';

上面這段程式碼的執行結果如下:

1、excuted : 99.005859375 ms

2、excuted : 103.00610351562 ms

3、excuted : 68.00390625 ms

平均:90.00528971354 ms

##分析 可以看出,在第二段程式碼中,使用了批量插入,此時的效率比第一段提高了84%。原因如下:

  • 使用第一段程式碼的時候,因為每一次迴圈裡都執行了一個mysql語句,此時php需要與mysql獲得連線,然後再執行mysql語句,然後再斷開。這就是第一段程式碼最主要的時間開銷–PHP與MySQL連線的網路傳輸IO
  • 第一段程式碼SQL語句解析的次數更多

因此,在第二段程式碼中,通過合併SQL語句來實現減少SQL語句解析的次數以及PHP與MySQL連線的次數來達到減少網路傳輸IO的開銷。

注意: 1、SQL語句是有長度限制的,因此,在進行SQL語句合併時務必不能超過SQL長度限制,通過設定max_allowed_packet可以修改,預設是1M,測試時修改為8M。

##總結

在進行對資料庫的批量操作(如:插入、更新、修改)時,應當儘可能將SQL語句合併後再執行而不是在迴圈中依次執行。

記錄下最近在專案中犯下的一個比較大的錯誤,以後不能再犯了。以前一直都沒有注意到,直到現在真正參與到企業專案中,自己的程式碼被老大指出錯誤後才發現自己的錯誤。學習了。

更多關於PHP相關內容感興趣的讀者可檢視本站專題:《php+mysql資料庫操作入門教程》、《php+mysqli資料庫程式設計技巧總結》、《php面向物件程式設計入門教程》、《PHP陣列(Array)操作技巧大全》、《php字串(string)用法總結》及《php常見資料庫操作技巧彙總》

希望本文所述對大家PHP程式設計有所幫助。