3

次の php スクリプトは、実行に約 22 秒かかります。それは正常ですか?そうでない場合、実行が遅くなる原因は何ですか?

$conn = mysql_connect('localhost', 'root', '123');
mysql_select_db('mydb', $conn);
$time1 = time();
for ($i=1;$i<500;$i++) {
mysql_query("Insert into accounts(id, username, email, password) VALUES(\"$i\", \"$i\",\"$i\",NOW())");
}
print time() - $time1; // return ~22

編集:テーブル構造:

CREATE TABLE IF NOT EXISTS `accounts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `email` varchar(200) NOT NULL,
  `password` varchar(20) NOT NULL,
  `status` varchar(10) DEFAULT 'pending',
  `email_newsletter_status` varchar(3) DEFAULT 'out',
  `email_type` varchar(4) DEFAULT 'text',
  `email_favorite_artists_status` varchar(3) DEFAULT 'out',
  `created_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7500 ;

このコードは、挿入速度をテストするためのものです。Zendフレームワーク(Zend_Dbのメソッドを挿入)を使用すると、同様の結果が得られるため、phpコードではなくmysqlに関連していると思います

Edit2: このクエリを実行するにはもっと良い方法があることは知っていますが、なぜこれが遅いのか知りたいです。

4

4 に答える 4

8

22秒はとても長いです。私の推測では、各挿入の後、INDEX を更新する必要があります。

代わりに、これをトランザクションとして実行してみてください。

mysql_query("START TRANSACTION");
for ($i=1;$i<500;$i++) {
    mysql_query("Insert into accounts(id, username, email, password) VALUES(\"$i\", \"$i\",\"$i\",NOW())");
}
mysql_query("COMMIT");
于 2012-08-15T20:48:30.200 に答える
6

複数の挿入ステートメントを実行するのではなく、それらをまとめて 1 つのステートメントとして実行する

 INSERT INTO example
  (example_id, name, value, other_value)
VALUES
  (100, 'Name 1', 'Value 1', 'Other 1'),
  (101, 'Name 2', 'Value 2', 'Other 2'),
  (102, 'Name 3', 'Value 3', 'Other 3'),
  (103, 'Name 4', 'Value 4', 'Other 4');

これにより、挿入が大幅に高速化されます

于 2012-08-15T20:48:43.850 に答える
2

ストックを使用している場合my.cnf、パフォーマンスはひどいものになる可能性があります。MySQL がどのように構成されているかを確認し、それに応じてパラメーターを調整することをお勧めします。より優れたエンジンである InnoDB をチューニングするには、多くの場合高速ですが安全でないデフォルトである MyISAM とは異なる値を調整する必要があります。

これらのクエリの実行にかなりの時間がかかる場合は、MySQL 管理者ツールで監視するSHOW PROCESSLISTか、頻繁に実行してエンジンの動作を確認してください。

このような単純なテーブルでは、MySQL ドライバーを介して直接 500 レコードを挿入するのに、せいぜい数秒しかかかりません。

于 2012-08-15T20:54:43.870 に答える
0

単一の挿入クエリを試してください。

$valStr = "";
for ($i=1;$i<500;$i++) {
    $valStr = $valStr . ($valStr == "" ? "" : ", ") . "('$i', '$i', '$i', NOW())";
}
if ($valStr != "") {
    mysql_query("Insert into accounts(id, username, email, password) VALUES $valStr");
}

また、mysql_*関数の使用を停止する必要があります。それらは廃止されています。代わりにPDO (PHP 5.1 以降でサポート) またはmysqli (PHP 4.1 以降でサポート) を使用してください。どちらを使用すればよいかわからない場合は、この記事をお読みください

于 2012-08-15T20:51:02.047 に答える