0

I want to insert many thousand records and I need this to be fast. I read a lot about this issue so I decided to drop my old approach (mysql_connect) and use prepare statements and mysqli. So In order to test the speed of this I write the following.

function load_data2db($sms_id){
$mysqli = new mysqli('localhost', 'root', 'cr3at1ve', 'tmp-clicknsend');
/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}


// Create statement object
$stmt = $mysqli->stmt_init();
if ($stmt = $mysqli->prepare("INSERT INTO isec_test (sms_id, status,msgid,prmsgid,mob,sms_history_id) values (?, ?, ?, ?, ?, ?)")) {


        /* Bind our params */
        $stmt->bind_param('ssssss',$sms_id,$status,$msgid,$prmsgid,$mob,$sms_history_id);

    for($i=0;$i<100000;$i++)
    {
        /* Set our params */
        $sms_id = "110";
        $status = "OK";
        $msgid  = "msgid";
        $prmsgid = "100-0";
        $mob = "306974386068";
        $sms_history_id = 102;

        /* Execute the prepared Statement */
        $stmt->execute();
    }


        /* Close the statement */
        $stmt->close();
}
else {
        /* Error */
        printf("Prepared Statement Error: %s\n", $mysqli->error);
}
}

load_data2db(10);

Then I did the same with the old way ( looping and inserting one by one)

include("mysql_connect.php");
 for($i=0;$i<100000;$i++)
    {
    $query = "INSERT INTO isec_test(sms_id,status,msgid) values ('1','OK','123-123')";
    $query = @mysql_query($query);
    }
mysql_close($dbc);

I made a lot of tests and always the simple mysql way was 1 sec faster. So I am puzzled. What can I do? Use LOAD DATA?

4

1 に答える 1

2

LOAD DATA LOCAL INFILE挿入時に行ごとに処理を行う必要がない限り、使用することをお勧めします。

SQLクエリを何千回も再解析する必要がなくなるため、データベース側ではSQLステートメントとバインディングパラメータの準備を高速化することをお勧めします。

ただし、PHP拡張機能自体には、アプリケーション側で実行する必要のあるコードが少し含まれています。mysqli拡張機能はより複雑である可能性があるため、反復操作のために古いmysql拡張機能よりもわずかに多くのオーバーヘッドで実行されます。

PHPでは、ループ内で十分な回数繰り返すと、単一の関数呼び出しのオーバーヘッドが顕著になる可能性があります。私は人々にこれらの2つのステートメントの間に測定可能な違いがあると私に言わせました:

$x = (int) '123';
$x = intval('123');

2行目は関数呼び出しであるため、速度は遅くなります(ただし、マージンはごくわずかです)。

于 2012-10-29T17:46:40.353 に答える