質問編集履歴
1
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,40 +3,40 @@
|
|
3
3
|
|
4
4
|
仮にインデックスを次のように3つセットした場合ですが、
|
5
5
|
```
|
6
|
-
CREATE TABLE
|
6
|
+
CREATE TABLE search_cache (
|
7
7
|
ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
8
8
|
service_id TINYINT(1) UNSIGNED NOT NULL,
|
9
9
|
q VARCHAR(100),
|
10
10
|
color VARCHAR(10),
|
11
|
-
updated_at DATETIME(6) NOT NULL
|
11
|
+
updated_at DATETIME(6) NOT NULL,
|
12
12
|
PRIMARY KEY (ID),
|
13
13
|
|
14
14
|
# インデックスをセット
|
15
|
-
INDEX
|
15
|
+
INDEX idx_search_cache_01(service_id),
|
16
|
-
INDEX
|
16
|
+
INDEX idx_search_cache_02(q),
|
17
|
-
INDEX
|
17
|
+
INDEX idx_search_cache_03(color)
|
18
18
|
);
|
19
19
|
```
|
20
20
|
この場合、次の`SELECT`でインデックスは効かないのではないでしょうか?
|
21
21
|
```sql
|
22
22
|
SELECT *
|
23
|
-
FROM
|
23
|
+
FROM cache_datas
|
24
24
|
WHERE service_id=1 AND q='りんご いちご' AND color='red'
|
25
25
|
```
|
26
26
|
###なぜこう考えたのか
|
27
27
|
インデックスは
|
28
|
-
`
|
28
|
+
`idx_search_cache_01` (`service_id`が対象カラム)
|
29
|
-
`
|
29
|
+
`idx_search_cache_02` (`q`が対象カラム )
|
30
|
-
`
|
30
|
+
`idx_search_cache_03` (`color`が対象カラム)
|
31
31
|
という3つでセットしています。
|
32
32
|
|
33
|
-
`WHERE`の最初に`service_id`を指定した場合、その時点でまず、検索対象データは`
|
33
|
+
`WHERE`の最初に`service_id`を指定した場合、その時点でまず、検索対象データは`idx_search_cache_01`となりますよね。
|
34
34
|
|
35
|
-
この`
|
35
|
+
この`idx_search_cache_01`に対しさらに`AND q='りんご いちご'`と指定していますが、`idx_search_cache_01`のインデックスの中には`q`に対するインデックスはありませんから、`idx_search_cache_01`の中では`q`の並び順は不明瞭ですよね。
|
36
36
|
|
37
|
-
そうであれば、`q`に対してセットした`
|
37
|
+
そうであれば、`q`に対してセットした`idx_search_cache_02`は、上記`SELECT`のように
|
38
38
|
|
39
|
-
一番目に`
|
39
|
+
一番目に`idx_search_cache_01`を指定した`SELECT`
|
40
40
|
(つまり一番目に`WHERE service_id=1`と指定した`SELECT`)
|
41
41
|
|
42
42
|
では効かないのではないかと考えたのですが…
|
@@ -46,7 +46,7 @@
|
|
46
46
|
上記の考え方があっていれば、ひょっとして、複合インデックスというのはこのための機能なのでしょうか?
|
47
47
|
|
48
48
|
つまりインデックスは3つでなく次のように1つに複合して、
|
49
|
-
`INDEX
|
49
|
+
`INDEX idx_search_cache_01(service_id,q,color)`
|
50
50
|
こうすることではじめて、上記`SELECT`でもインデックスが効くという仕組みですか?
|
51
51
|
|
52
52
|
###さらなる疑問
|
@@ -56,14 +56,14 @@
|
|
56
56
|
```sql
|
57
57
|
# パターン【A】
|
58
58
|
SELECT *
|
59
|
-
FROM
|
59
|
+
FROM search_cache
|
60
60
|
WHERE service_id=1 AND q='りんご いちご' AND color='red'
|
61
61
|
|
62
62
|
# パターン【B】
|
63
63
|
SELECT *
|
64
|
-
FROM
|
64
|
+
FROM search_cache
|
65
65
|
WHERE service_id=1 AND color='red'
|
66
66
|
```
|
67
67
|
この場合は複合インデックスも次のように貼るということになるのでしょうか?
|
68
|
-
【A】のためのインデックス → `INDEX
|
68
|
+
【A】のためのインデックス → `INDEX idx_search_cache_01(service_id,q,color)`
|
69
|
-
【B】のためのインデックス → `INDEX
|
69
|
+
【B】のためのインデックス → `INDEX idx_search_cache_02(service_id,color)`
|