回答編集履歴

4

修正

2018/03/28 03:51

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -37,3 +37,25 @@
37
37
  それから、SQL自体は省略した内容じゃないのでしょうか?
38
38
 
39
39
  フルスキャンする原因はin()ではない別な記述のような感じですけど。
40
+
41
+ 追記
42
+
43
+ --
44
+
45
+ >なぜin句だとフルスキャンになってしまうのか
46
+
47
+ 以下が参考になるかと。
48
+
49
+ [なぜMySQLのサブクエリは遅いのか。](http://nippondanji.blogspot.jp/2009/03/mysql_25.html)
50
+
51
+ > MySQLは内部的にINを直接処理することができないので、EXISTSに変換することでSQL的には相関のないサブクエリも相関サブクエリになってしまうのである。
52
+
53
+ > きちんと気をつけて使えばサブクエリも高速に実行される。
54
+
55
+ もちろんJOINに書き換えた方が速いのは言うまでもないが
56
+
57
+
58
+
59
+ in でも 相関サブクエリーでインデックスが適切なら遅くないってことなので、
60
+
61
+ 一時テーブルで試されてはどうですか。

3

修正

2018/03/28 03:51

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -26,7 +26,9 @@
26
26
 
27
27
 
28
28
 
29
- インデックス検索になった方が必ず高速ということであれば、[インデックスヒント](https://dev.mysql.com/doc/refman/5.6/ja/index-hints.html)を使用してみて下さい。
29
+ ~~インデックス検索になった方が必ず高速ということであれば、[インデックスヒント](https://dev.mysql.com/doc/refman/5.6/ja/index-hints.html)を使用してみて下さい。~~
30
+
31
+ (in に関するMySQLの振る舞いの問題ということなので、ヒントを与えても無駄だと思うので)
30
32
 
31
33
 
32
34
 

2

追記

2018/03/28 03:44

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -20,6 +20,18 @@
20
20
 
21
21
  **※(a,b)でプライマリーでしたね。上記は無駄なので無視して下さい。**
22
22
 
23
- 500万行に対して、フルスキャンとなった場合の抽出件数は何件程度なのでしょう?
23
+ ~~500万行に対して、フルスキャンとなった場合の抽出件数は何件程度なのでしょう?~~
24
+
25
+ (これも書いてますね)
26
+
27
+
24
28
 
25
29
  インデックス検索になった方が必ず高速ということであれば、[インデックスヒント](https://dev.mysql.com/doc/refman/5.6/ja/index-hints.html)を使用してみて下さい。
30
+
31
+
32
+
33
+ 500万件に対して2,000件を抽出するということでいいんでしょうか?
34
+
35
+ それから、SQL自体は省略した内容じゃないのでしょうか?
36
+
37
+ フルスキャンする原因はin()ではない別な記述のような感じですけど。

1

修正

2018/03/27 12:23

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -16,6 +16,10 @@
16
16
 
17
17
 
18
18
 
19
+ ----------------------------------------------
20
+
21
+ **※(a,b)でプライマリーでしたね。上記は無駄なので無視して下さい。**
22
+
19
23
  500万行に対して、フルスキャンとなった場合の抽出件数は何件程度なのでしょう?
20
24
 
21
25
  インデックス検索になった方が必ず高速ということであれば、[インデックスヒント](https://dev.mysql.com/doc/refman/5.6/ja/index-hints.html)を使用してみて下さい。