私は構築しているシステムのパフォーマンスを試していますが、それは本当に遅いですし、なぜそれが遅いのかわかりません。私がテストしているのは、データベースにできるINSERTの数と、1秒あたり約22回です。それは本当に遅く聞こえて、私は挿入物を私は約0.5秒で30000のレコードを挿入することができる私は大きなSQLクエリをsingelをしようとしたとき。現実には、挿入はシステム内のさまざまなユーザーによって行われるため、接続、クエリの送信、クエリの解析などのオーバーヘッドが常に存在します。これまでに試したこと:遅い性能MySql
- mysqliにはできるだけコードを入れないでください。 = 22 INSERT per second
- できるだけコードを小さくしたPDO。 = 22 127.0.0.1へのローカルホストからの接続ホストを変更
- 毎秒INSERT =文オブジェクトなし
- 秒mysqliのあたり22 INSERTおよびSQLインジェクションのチェック=
毎秒22 INSERTだから、何かの縫い目ここで間違っている。
システムスペック:
- インテルのi5
- 16ギグラム
- 7200 rpmのディスクドライブ
ソフトウェア:
- のWindows 10
- XAMP P、まったく新しいMariaDBで
- DBエンジンinnoDB。
Iテストを行うために使用されるコード:
$amountToInsert = 1000;
//$fakeData is an array with randomly generated emails
$fakeData = getFakeData($amountToInsert);
$db = new DatabaseHandler();
for ($i = 0; $i < $amountToInsert; $i++) {
$db->insertUser($fakeUsers[$i]);
}
$db->closeConnection();
データベースを呼び出すクラス:
:class DatabaseHandler {
private $DBHOST = 'localhost';
private $DBUSERNAME = 'username';
private $DBPASSWORD = 'password';
private $DBNAME = 'dbname';
private $DBPORT = 3306;
private $mDb;
private $isConnected = false;
public function __construct() {
$this->mDb = new mysqli($this->DBHOST, $this->DBUSERNAME
, $this->DBPASSWORD, $this->DBNAME
, $this->DBPORT);
$this->isConnected = true;
}
public function closeConnection() {
if ($this->isConnected) {
$threadId = $this->mDb->thread_id;
$this->mDb->kill($threadId);
$this->mDb->close();
$this->isConnected = false;
}
}
public function insertUser($user) {
$this->mDb->autocommit(true);
$queryString = 'INSERT INTO `users`(`email`, `company_id`) '
.'VALUES (?, 1)';
$stmt = $this->mDb->prepare($queryString);
$stmt->bind_param('s', $user);
if ($stmt->execute()) {
$stmt->close();
return 1;
} else {
$stmt->close();
return 0;
}
}
}
"ユーザ" テーブルは、以下の構造を有する4列を有します
- ID INT符号なしプライマリキー
- メールVARCHAR(60)
- のcompany_idのINT符号なしINDEX
- のGUID TEXT
私はここで途方に暮れてると、本当にどこ次探せばわかりません。正しい方向への助けは非常に高く評価されるでしょう。
設定を考えると、1秒あたり22個は妥当と思われます。あなたが実行するすべての 'コミット 'は、ディスクへの書き込み、物理的な、キャッシングが許可されていなければならないことを忘れないでください。おそらくメタデータやもののための複数の書き込み。 1回のトランザクションで多数の挿入を行うと、1秒あたりのレコード数が増えますが、それが実際の使用例のシナリオではない場合、そのようなベンチマークは愚かでしょう。 – JimmyB
これがオプションの場合は、この表のエンジンを* InnoDB *から* MyISAM *に変更してください。多くのフィールドを持たないユーザーテーブルであり、頻繁な更新が必要ない場合は、問題ではありません。 INSERTは地獄速くなりますが、いくつかの欠点があります。あなたのINSERTを比較するためだけにperf結果を試してみる価値があります。 –
OSクラッシュの場合にトランザクションの最後の1分を失うことができれば、my.iniのinnodb-flush-log-at-trx-commit = 0はあなたの友人です。バッチインサートをトランザクションに挿入すると、トランザクションはあなたの友人になります。 –