2016-07-28 14 views
1

MySQLでは「サブクエリ」を使用して、ここでいくつかのotherquestionsに設立されたように同一のクエリが高速で実行「を選択し、」一方で、それが遅くなる原因を削除:インデックスを使用することができ、JOINMySQL DELETEがサブクエリでインデックスを使用できないのはなぜですか?

MariaDB [as_01_import]> explain select * from invoice_payment where invoice_id in (select id from dochead where system_id = 5786); 
+------+-------------+-----------------+------+---------------------------------------+----------------------------+---------+-------------------------+------+-------------+ 
| id | select_type | table   | type | possible_keys       | key      | key_len | ref      | rows | Extra  | 
+------+-------------+-----------------+------+---------------------------------------+----------------------------+---------+-------------------------+------+-------------+ 
| 1 | PRIMARY  | dochead   | ref | PRIMARY,dochead_system_id    | dochead_system_id   | 4  | const     | 891 | Using index | 
| 1 | PRIMARY  | invoice_payment | ref | invoice_payment_invoice_fk,invoice_id | invoice_payment_invoice_fk | 4  | as_01_import.dochead.id | 1 |    | 
+------+-------------+-----------------+------+---------------------------------------+----------------------------+---------+-------------------------+------+-------------+ 


MariaDB [as_01_import]> explain delete from invoice_payment where invoice_id in (select id from dochead where system_id = 5786); 
+------+--------------------+-----------------+-----------------+---------------------------+---------+---------+------+---------+-------------+ 
| id | select_type  | table   | type   | possible_keys    | key  | key_len | ref | rows | Extra  | 
+------+--------------------+-----------------+-----------------+---------------------------+---------+---------+------+---------+-------------+ 
| 1 | PRIMARY   | invoice_payment | ALL    | NULL      | NULL | NULL | NULL | 1235451 | Using where | 
| 2 | DEPENDENT SUBQUERY | dochead   | unique_subquery | PRIMARY,dochead_system_id | PRIMARY | 4  | func |  1 | Using where | 
+------+--------------------+-----------------+-----------------+---------------------------+---------+---------+------+---------+-------------+ 
2 rows in set (0.44 sec) 

知って、私はしたいと思いますエキスパートに質問してください:

MySQL/MariaDBがSUBQUERYのDELETEでインデックスを使用できないのはなぜですか?それは実装上の問題か、それとも概念上の問題ですか?これを解決する計画はありますか?同じ問題が他のSQLベンダーに影響していますか?

答えて

2

サブクエリは派生テーブルであり、マテリアライズされません。それらは一時テーブルに表示されます。

Iはthis answerに書いたように:

文書Derived Tables in MySQL 5.7は後者が原因マテリア派生テーブル出力の変化が内 に組み込まれる にペナルティを提供しないであろう バージョン5.6および5.7のためのそれをよく説明します外側のクエリ以前のバージョンでは、実質的なオーバーヘッドは でした。

1

IN (SELECT ...)を使用しないでください。代わりに、ここに記載されているように複数のテーブルDELETEを使用してください。http://dev.mysql.com/doc/refman/5.5/en/delete.html

このようにすると、該当する場合はインデックスが使用されます。

+0

質問を読んだことがありますか? – romaninsh

+0

リックは、サブクエリの動作を説明するのとは違って、別のやり方をしているような、それの他の側面に集中していたと思います。それは私から遠く離れていると言いました。[Docs Multi-Table Delete](http://stackoverflow.com/documentation/mysql/1487/delete/8768/multi-table-deletes#t=201607292124449831703)。 – Drew

関連する問題