私はMySQLに2つのテーブルを持っています。MySQLのサブクエリを削除する
CREATE TABLE `TABLE_A` (
`id_a` varchar(50) NOT NULL ,
`ref` varchar(50) NOT NULL,
`colA` varchar(50) NOT NULL,
:
PRIMARY KEY (`id_a`),
KEY `INDEX_A1` (`ref`)
KEY `INDEX_A2` (`colA`)
) ENGINE=InnoDB
CREATE TABLE `TABLE_B` (
`id_b` int(11) NOT NULL AUTO_INCREMENT,
`ref` varchar(50) NOT NULL,
`status` int(11) NOT NULL,
:
PRIMARY KEY (`ib_b`),
KEY `INDEX_B1` (`ref`),
) ENGINE=InnoDB
私は以下のようにこれらのテーブルにクエリを持っています。しかし、このクエリは遅いです。
このSQLではexplain
を試しましたが、その結果は以下のとおりです。
+----+-------------+------------+--------+--------------+----------+---------+--------+-------+-------------+
| id | select_type | table | type | possible_key | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+--------------+----------+---------+--------+-------+-------------+
| 1 | PRIMARY | T1 | ref | INDEX_A2 | INDEX_A2 | 152 | const | 136 | Using where |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 29400 | Using where |
| 2 | DERIVED | TABLE_B | index | NULL | INDEX_B1 | 152 | NULL | 36223 | Using where |
+----+-------------+------------+--------+--------------+----------+---------+--------+-------+-------------+
私はクエリを改善するためにサブクエリを排除する必要があると思います。
サブクエリなしで同じことを行うにはどうすればよいですか?それとも、改善のための他の方法がありますか?
問題が起きそうなのは、左結合をしてからBテーブルの値をフィルタリングすることです。T2.status =? 。サブクエリ内でこの条件を移動してみてください。 – Alex
返信いただきありがとうございます。しかし、TABLE_Bの90%以上がstatus =?と一致するため、あなたの提案は効果がありません。 –
'INDEX_B1'を'(ref、status) 'に変更することでサブクエリのパフォーマンスを改善できると思います。 – Barmar