質問編集履歴
1
訂正
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
```
|
10
10
|
|
11
|
-
CREATE TABLE
|
11
|
+
CREATE TABLE search_cache (
|
12
12
|
|
13
13
|
ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
14
14
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
color VARCHAR(10),
|
20
20
|
|
21
|
-
updated_at DATETIME(6) NOT NULL
|
21
|
+
updated_at DATETIME(6) NOT NULL,
|
22
22
|
|
23
23
|
PRIMARY KEY (ID),
|
24
24
|
|
@@ -26,11 +26,11 @@
|
|
26
26
|
|
27
27
|
# インデックスをセット
|
28
28
|
|
29
|
-
INDEX idx_
|
29
|
+
INDEX idx_search_cache_01(service_id),
|
30
30
|
|
31
|
-
INDEX idx_
|
31
|
+
INDEX idx_search_cache_02(q),
|
32
32
|
|
33
|
-
INDEX idx_
|
33
|
+
INDEX idx_search_cache_03(color)
|
34
34
|
|
35
35
|
);
|
36
36
|
|
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
SELECT *
|
44
44
|
|
45
|
-
FROM
|
45
|
+
FROM cache_datas
|
46
46
|
|
47
47
|
WHERE service_id=1 AND q='りんご いちご' AND color='red'
|
48
48
|
|
@@ -52,29 +52,29 @@
|
|
52
52
|
|
53
53
|
インデックスは
|
54
54
|
|
55
|
-
`idx_
|
55
|
+
`idx_search_cache_01` (`service_id`が対象カラム)
|
56
56
|
|
57
|
-
`idx_
|
57
|
+
`idx_search_cache_02` (`q`が対象カラム )
|
58
58
|
|
59
|
-
`idx_
|
59
|
+
`idx_search_cache_03` (`color`が対象カラム)
|
60
60
|
|
61
61
|
という3つでセットしています。
|
62
62
|
|
63
63
|
|
64
64
|
|
65
|
-
`WHERE`の最初に`service_id`を指定した場合、その時点でまず、検索対象データは`idx_
|
65
|
+
`WHERE`の最初に`service_id`を指定した場合、その時点でまず、検索対象データは`idx_search_cache_01`となりますよね。
|
66
66
|
|
67
67
|
|
68
68
|
|
69
|
-
この`idx_
|
69
|
+
この`idx_search_cache_01`に対しさらに`AND q='りんご いちご'`と指定していますが、`idx_search_cache_01`のインデックスの中には`q`に対するインデックスはありませんから、`idx_search_cache_01`の中では`q`の並び順は不明瞭ですよね。
|
70
70
|
|
71
71
|
|
72
72
|
|
73
|
-
そうであれば、`q`に対してセットした`idx_
|
73
|
+
そうであれば、`q`に対してセットした`idx_search_cache_02`は、上記`SELECT`のように
|
74
74
|
|
75
75
|
|
76
76
|
|
77
|
-
一番目に`idx_
|
77
|
+
一番目に`idx_search_cache_01`を指定した`SELECT`
|
78
78
|
|
79
79
|
(つまり一番目に`WHERE service_id=1`と指定した`SELECT`)
|
80
80
|
|
@@ -94,7 +94,7 @@
|
|
94
94
|
|
95
95
|
つまりインデックスは3つでなく次のように1つに複合して、
|
96
96
|
|
97
|
-
`INDEX idx_
|
97
|
+
`INDEX idx_search_cache_01(service_id,q,color)`
|
98
98
|
|
99
99
|
こうすることではじめて、上記`SELECT`でもインデックスが効くという仕組みですか?
|
100
100
|
|
@@ -114,7 +114,7 @@
|
|
114
114
|
|
115
115
|
SELECT *
|
116
116
|
|
117
|
-
FROM
|
117
|
+
FROM search_cache
|
118
118
|
|
119
119
|
WHERE service_id=1 AND q='りんご いちご' AND color='red'
|
120
120
|
|
@@ -124,7 +124,7 @@
|
|
124
124
|
|
125
125
|
SELECT *
|
126
126
|
|
127
|
-
FROM
|
127
|
+
FROM search_cache
|
128
128
|
|
129
129
|
WHERE service_id=1 AND color='red'
|
130
130
|
|
@@ -132,6 +132,6 @@
|
|
132
132
|
|
133
133
|
この場合は複合インデックスも次のように貼るということになるのでしょうか?
|
134
134
|
|
135
|
-
【A】のためのインデックス → `INDEX idx_
|
135
|
+
【A】のためのインデックス → `INDEX idx_search_cache_01(service_id,q,color)`
|
136
136
|
|
137
|
-
【B】のためのインデックス → `INDEX idx_
|
137
|
+
【B】のためのインデックス → `INDEX idx_search_cache_02(service_id,color)`
|