teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

訂正

2020/07/01 04:31

投稿

yakan
yakan

スコア19

title CHANGED
File without changes
body CHANGED
@@ -3,40 +3,40 @@
3
3
 
4
4
  仮にインデックスを次のように3つセットした場合ですが、
5
5
  ```
6
- CREATE TABLE fruits (
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 DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
11
+ updated_at DATETIME(6) NOT NULL,
12
12
  PRIMARY KEY (ID),
13
13
 
14
14
  # インデックスをセット
15
- INDEX idx_fruits_01(service_id),
15
+ INDEX idx_search_cache_01(service_id),
16
- INDEX idx_fruits_02(q),
16
+ INDEX idx_search_cache_02(q),
17
- INDEX idx_fruits_03(color)
17
+ INDEX idx_search_cache_03(color)
18
18
  );
19
19
  ```
20
20
  この場合、次の`SELECT`でインデックスは効かないのではないでしょうか?
21
21
  ```sql
22
22
  SELECT *
23
- FROM fruits
23
+ FROM cache_datas
24
24
  WHERE service_id=1 AND q='りんご いちご' AND color='red'
25
25
  ```
26
26
  ###なぜこう考えたのか
27
27
  インデックスは
28
- `idx_fruits_01` (`service_id`が対象カラム)
28
+ `idx_search_cache_01` (`service_id`が対象カラム)
29
- `idx_fruits_02` (`q`が対象カラム )
29
+ `idx_search_cache_02` (`q`が対象カラム )
30
- `idx_fruits_03` (`color`が対象カラム)
30
+ `idx_search_cache_03` (`color`が対象カラム)
31
31
  という3つでセットしています。
32
32
 
33
- `WHERE`の最初に`service_id`を指定した場合、その時点でまず、検索対象データは`idx_fruits_01`となりますよね。
33
+ `WHERE`の最初に`service_id`を指定した場合、その時点でまず、検索対象データは`idx_search_cache_01`となりますよね。
34
34
 
35
- この`idx_fruits_01`に対しさらに`AND q='りんご いちご'`と指定していますが、`idx_fruits_01`のインデックスの中には`q`に対するインデックスはありませんから、`idx_fruits_01`の中では`q`の並び順は不明瞭ですよね。
35
+ この`idx_search_cache_01`に対しさらに`AND q='りんご いちご'`と指定していますが、`idx_search_cache_01`のインデックスの中には`q`に対するインデックスはありませんから、`idx_search_cache_01`の中では`q`の並び順は不明瞭ですよね。
36
36
 
37
- そうであれば、`q`に対してセットした`idx_fruits_02`は、上記`SELECT`のように
37
+ そうであれば、`q`に対してセットした`idx_search_cache_02`は、上記`SELECT`のように
38
38
 
39
- 一番目に`idx_fruits_01`を指定した`SELECT`
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 idx_fruits_01(service_id,q,color)`
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 fruits
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 fruits
64
+ FROM search_cache
65
65
  WHERE service_id=1 AND color='red'
66
66
  ```
67
67
  この場合は複合インデックスも次のように貼るということになるのでしょうか?
68
- 【A】のためのインデックス → `INDEX idx_fruits_01(service_id,q,color)`
68
+ 【A】のためのインデックス → `INDEX idx_search_cache_01(service_id,q,color)`
69
- 【B】のためのインデックス → `INDEX idx_fruits_02(service_id,color)`
69
+ 【B】のためのインデックス → `INDEX idx_search_cache_02(service_id,color)`