MySQL DBサーバーでOPTIMIZE TABLEクエリを実行する利点


9

OPTIMIZE TABLE tbl_nameMySQLサーバーでクエリを実行することで得られる利点(実際に実用的)を教えてください。

これを一度確認したところ、これを実行した後、フラグメントの再配置などが原因で次のDBヒットに時間がかかる可能性があることがわかりましたが、その後のヒットではパフォーマンスが表示され、クエリキャッシュがこのトリックを実行するかどうかわかりません最適化または最適化のみでこのトリックを行います。

MySQLでの作業が私たちのプロジェクトで重要性を増しているので、可能であれば、実際のパフォーマンスの差の値を誰かがガイドしてくれますか?

回答:


7

OPTIMIZE TABLEはデフラグを実行しないことに注意してください。内部的に、OPTIMIZE TABLEはいくつかの操作(一時ファイルへのデータのコピー、インデックスの再作成、インデックス統計の再計算)を実行します。実際、私が持っている例は、示されているように手動で実行できます。

例:を最適化する場合はmydb.mytable、次のコマンドを入力します。

OPTIMIZE TABLE mydb.mytable;

mysqlは内部で次のことを実行することに注意してください。

CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;

これは、大量のUPDATEおよびDELETEが発生するテーブルに非常に役立ちます。

これを実行すると、2つのことを達成できます。

  1. mysqlが適切なサイズのフラグメントにデータをロードしようとしてテーブル内のフラグメントを調べないようにします。これらのフラグメントを削除すると、この操作が減ります。

  2. インデックス統計を再計算すると、MySQLクエリオプティマイザーがより優れたEXPLAINプランを構築するのに役立ちます。そうしないと、MySQL Query OptimizerがEXPLAINプランで誤った推測をすることを決定したため、クエリの実行時間が低下する可能性があります。これは、大量のUPDATEとDELETEがあったテーブルの明確な症状です。

警告

キャッシュに関しては、全表スキャンを行うため、キャッシュはすぐに飛び込みます。MyISAMの場合、インデックスページはMyISAMキーキャッシュに出入りします。InnoDBの場合、データページとインデックスページはInnoDBバッファープールに出入りします。


お返事をありがとうございます。あなたの観点からは、cronジョブなどのサービスを使用して、頻繁に更新されるテーブルの1つに最適化テーブルをスケジュールして、より良いパフォーマンスを実現できるようにすることを理解しています。これに加えて、私はこのテーブルにInnoDBを使用しています。これはより良い選択ですか?また、クエリのパフォーマンスを向上させるために提案されたSQL ServerのHASH結合を見つけました。これについて説明し、MySQLでこれに類似したものを取得する方法を教えてください。また、MySQL [Windows7バージョン]のSQLクエリオプティマイザーも教えてください。
サラバナン2011年

@savaranan:私が参照していたMySQLクエリオプティマイザーは、MySQLに組み込まれた内部クエリオプティマイザーでした。ところで、最適化したいテーブルはInnoDBなので、DISABLE KEYSとENABLE KEYSのステップをスキップできます。また、ANALYZE TABLEはスキップできます。これは、InnoDBが、インデックスダイブと呼ばれるBTREEインデックスからのページを使用した近似によってテーブルのカーディナリティを再計算するため、InnoDBテーブルではまったく役に立たないためです。
RolandoMySQLDBA 2011年

@savaranan:HASHインデックスに関する限り、InnoDBには適応ハッシュインデックスがあります(dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html)。独自のハッシュインデックスをエミュレートし、「高性能のMySQL」(のページ103〜106に基づいて衝突の取り扱い上の素敵な提案もありamazon.com/dp/0596101716を
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.