2016-05-20 3 views
1

私は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 | 
+----+-------------+------------+--------+--------------+----------+---------+--------+-------+-------------+ 

私はクエリを改善するためにサブクエリを排除する必要があると思います。

サブクエリなしで同じことを行うにはどうすればよいですか?それとも、改善のための他の方法がありますか?

+0

問題が起きそうなのは、左結合をしてからBテーブルの値をフィルタリングすることです。T2.status =? 。サブクエリ内でこの条件を移動してみてください。 – Alex

+0

返信いただきありがとうございます。しかし、TABLE_Bの90%以上がstatus =?と一致するため、あなたの提案は効果がありません。 –

+0

'INDEX_B1'を'(ref、status) 'に変更することでサブクエリのパフォーマンスを改善できると思います。 – Barmar

答えて

0

これを試してみてください:

select 
    t1.* 
from table_a as t1 
    inner join table_b as t2 
    on t1.ref = t2.ref 
    left outer join table_b as t3 
    on t3.ref = t2.ref 
    and t3.status > t2.status 
where t3.status is null; 

Thisは、上記の作業すべき理由の良い説明があります。

+0

'WHERE T2.status =?'を追加する必要があります。とT1.colA =? '私はそれを含めるのを忘れてしまった。 – ghenghy

+0

答えの中に説明の骨を実際に入れておけば、それは完璧です。リンクされた記事はいつでも削除することができますので、今の回答よりもはるかに役に立たないようにすることができます。 – Shadow

+0

ポイントを獲得しました。おそらく私は時間があるときに私は戻って自分の説明を追加します。残念ながら、私はバロンが彼のポストにしているように、どこにでも物を置くことはまずありません。 – ghenghy