猫型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

執筆者:

関連記事

sqlserver

「.NET」と「ASP.NET」からのSQL Serverへのコネクションを確認する(1)

INDEX1 コネクション数と状態を確認する2 コネクションプールとは3 コネクションを制御する設定 コネクション数と状態を確認する SQLSERVERのコネクション数を確認するには下記のSQLを実行 …

sqlserver

SQLSERVER saでログインできるようにする

私はsaも設定しておくべきだと思います。 そこでsaログインするための確認ポイントです。 INDEX1 ログインを有効にする2 サーバー認証の設定3 名前付きパイプ ログインを有効にする Manage …

sqlserver

「.NET」と「ASP.NET」からのSQL Serverへのコネクションを確認する(2)

「.NET」と「ASP.NET」からの接続には大きな違いがあります。 それは普通の?(exe形式の)アプリケーションか、Webアプリケーションかです。 この違いはアプリの終了というタイミングに大きく影 …

mysql

mysqldumpでテーブル毎のダンプを圧縮して取得するスクリプト

mysqldumpではデータベースを指定して一括してダンプを取得できます。テーブル毎のダンプも取得できます。 しかし、一括して取得したダンプの1つのテーブルだけをインポートすることはできません。これは …

mysql

MySQLのデータ構造

MySQLのインストールは簡単ですが、 ディレクトリ構造を知っておくことは障害対応にも必要ですのでまとめです。 MYSQLのデータ構成 /etc/my.cnfでメインディレクトリやソケット(mysql …