Oracle やその他のリレーショナル データベースを使用したことのある DBA や開発者は皆、データベースがサブクエリ用に最適化されており、テーブルの実行を促進する適切な選択ができると考えており、この経験を MySQL データベースに移植します。残念ながら、mysql はサブクエリの処理でがっかりするかもしれません。私たちの運用システムでは、次の問題が発生しました:
select i_id, sum(i_sell) as i_sell from table_data where i_id in (select i_id from table_data where Gmt_create >= ‘2011-10-07 00:00:00’) group by i_id;
(注: SQL のビジネス ロジックは、次のような例として使用できます。まず 10 日に新しく販売された 100 冊の本を出版してください。 -07 を実行し、年間を通じてこれら 100 冊の新しく販売された書籍の売上をクエリします)。
この SQL のパフォーマンスの問題は、mysql オプティマイザーがサブクエリを処理する際にサブクエリを書き換えるという弱点が原因です。通常、最初に内部から外部へのサブクエリの結果を完了し、次にサブクエリを使用して外部クエリ テーブルを駆動してクエリを完了したいと考えますが、mysql 処理は最初に外部テーブル内のすべてのデータをスキャンします。それぞれのデータはサブクエリに転送され、その外観が非常に大きい場合、パフォーマンスの問題が発生します。
table_data テーブルのデータは同時に 70W あるため、サブクエリ内の時間 大量のデータがあり、大量のデータが繰り返されるため、700,000 件近くの相関が必要になります。多数の相関により、この SQL は完了するまでに数時間実行されるため、 sql:
SELECT t2.i_id, SUM(t2.i_sell) AS sold FROM (SELECT distinct i_id FROM table_data WHERE gmt_create >= ‘2011-10-07 00:00:00’) t1, table_data t2 WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
サブクエリを変更します。相関させるために、t1 が t2 に関連する回数を減らすためにサブクエリに distinct を追加します。
変換後、SQL の実行時間は 100 ミリ秒未満に低下しました。
以上が実稼働ライブラリの mysql で発生するサブクエリの例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。