0

少し時間を割くことができるSuperGuruMySQL/PHPのプロからのヘルプとアドバイスを探してください。

私はPHP/MySQLにWebアプリケーションを持っていますが、これは何年にもわたって成長し、多くの検索を取得しています。新しい行のさまざまな毎日のデータダンプがMySQLLOADDATA INFILEを使用して処理されるときに、このボトルネックが発生します。

約150万行の大きなMyISAMテーブルであり、すべてのSELECTクエリがそのテーブルで発生します。これらが約600k行のLOADDATAINFILE(および古いデータの削除)中に発生すると、それらはバックアップされ、解放されるまでに約30分以上かかり、これらの検索は無駄になります。

妥当な時間枠でSELECT結果を提供する機能を維持しながら、そのテーブルを更新する方法を考え出す必要があります。

私は完全にアイデアがなく、この種の問題に初めて遭遇したため、自分で解決策を思いつくことができませんでした。

この種の問題を解決する方法を学びたいので、同様の過去の経験からの有益なアドバイス、解決策、または指針をいただければ幸いです。

みなさん、ありがとうございました!J

4

3 に答える 3

1

LOADDATAINFILEにはCONCURRENTキーワードを使用できます。このように、データをロードするとき、テーブルは引き続きSELECTをサーバーできます。

削除に関しては、これはもっと複雑です。'status' INT(1)という列を個人的に追加します。この列は、行がアクティブかどうか(=削除)を定義し、この列のステータスに基づいてルールでテーブルを分割します。

このようにして、status = 0:PIがこの最後のソリューションをテストしていないすべての行を削除する方が簡単になります。近い将来、これを行う可能性があります。

テーブルが最適化されている場合、CONCURRENTキーワードが機能します。FREE_SPACEがある場合、LOADDATAINFILEはテーブルをロックします。

于 2011-09-06T09:34:35.130 に答える
0

MyISAMは行レベルのロックをサポートしていないため、mysqldumpなどの操作では、一貫したダンプを保証するためにテーブル全体をロックする必要があります。唯一の実用的なオプションは、行レベルのロックをサポートする(InnoDBなどの)別のテーブルに切り替えるか、ダンプを小さな部分に分割することです。小さなダンプは、ダンプ/リロード中もテーブルをロックしますが、ロック期間は短くなります。

より厄介なオプションは、「ライブ」テーブルと「バックアップ」テーブルを用意することです。バックアップテーブルでダンプ/ロード操作を実行します。それらがcopmleteである場合は、ライブテーブルと交換します(テーブルの名前を変更するか、コードで使用しているテーブルを動的に変更します)。古いデータの可能性のある短いウィンドウでライブできる場合は、これがより良い可能性があります。オプション。

于 2011-02-21T23:02:08.043 に答える
0

テーブルストレージエンジンをMyISAMからInnoDBに切り替える必要があります。InnoDBは、(MyISAMのテーブルロックとは対照的に)行ロックを提供します。つまり、あるクエリが行の更新または挿入でビジー状態のときに、別のクエリが同時に別の行を更新できます。

于 2011-02-21T23:03:52.100 に答える