猫型iPS細胞研究所

Windows、Linux、iOS、DB、Network

DataBase MySQL

MySQLのexists

投稿日:2013年1月27日 更新日:

exists自体はほとんどのSQL自体に実装されていると思われます。
しかし、使用方法を誤るとレスポンスに大きな影響を与えてしまします。

副問合せであるexists内部で、集問い合わせのキー列と結合していても、主問い合わせのキー参照にはならず、下手をすれば全検索になってしまうということです。

例えば、以下のようなSQLではtable1を全文検索してしまいます。

 
select count(*)
from table1
where
exists
(
 select *
 from table2
 and table2.id between 50 and 100
 and table2.id = table1.id
)

and table2.id = table1.idとしていても、table1は全文検索してしまうのです。
table1に100万行あったとしたら、想定外のレスポンス低下となるでしょう。

対応するには条件分にexists以外にtable1に対する条件が必用です。

 
select count(*)
from table1
where
exists
(
 select *
 from table2
 and table2.id between 50 and 100
 and table2.id = table1.id
)
and table1.id between 1 and 500

このような失敗を起こさないためにも、常にexplainを使用して、実行計画を確認することが大事です。

 
explain 
select count(*)
from table1
where
exists
(
 select *
 from table2
 and table2.id between 50 and 100
 and table2.id = table1.id
)
and table1.id between 1 and 500

Gooleアドセンス用336

Gooleアドセンス用336

-DataBase, MySQL

執筆者:

関連記事

mysql

MySQL load dataでcsvをインサートする

かなり高速でinsertしてくれます。 INDEX1 使い方2 ERROR 10453 [補足]insertを高速にする 使い方 MySQLにログインして、データベースを指定して実行します。 mysq …

mysql

MySQLでフラグの列でSELECTする。(複合インデックスの使用条件)

status=’1’とかdelete=’0’といった条件はよく使用することでしょう。 そこでフラグにはどのデータ型がベストなのでしょうか。 INDEX1 …

select insert

私は以前SQLの順番にinsert selectと呼んでいて、笑われたことがあります。 select insertだ!と当時の上司に言われました。 なるほど、副問い合わせのselectが実行されて、そ …

mysql

MySQLのバイナリログを見てスレーブ停止の原因を調査する

以前スレーブ側の更新がとまっていることに気付きました :x001: その時のトラブルシューティングの手順です。 INDEX1 1.スレーブ側で、SlaveS tatusを確認する2 2.スレーブ側のロ …

mysql

MySQL:エラー:The total number of locks exceeds the lock table size

The total number of locks exceeds the lock table sizeは、大量にデータを削除する場合等に発生する可能性があります。 見ての通り、ロックするメモリー不 …