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

質問編集履歴

3

ご指摘頂いた点について加筆致しました。(explain結果について)

2019/10/15 07:20

投稿

tog
tog

スコア26

title CHANGED
File without changes
body CHANGED
@@ -57,8 +57,9 @@
57
57
  set A.value=B.value;
58
58
  ```
59
59
  explain結果
60
-
60
+ ```MySQL5.7
61
61
  | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
62
62
  | ---: | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | --- |
63
63
  | 1 | SIMPLE | B | \N | ALL | PRIMARY,テーブルB | \N | \N | \N | 1658424 | 100.00 | \N |
64
- | 1 | UPDATE | A | \N | ref | PRIMARY,テーブルA | PRIMARY | 202 | B.id | 916054 | 1.11 | Using where |
64
+ | 1 | UPDATE | A | \N | ref | PRIMARY,テーブルA | PRIMARY | 202 | B.id | 916054 | 1.11 | Using where |
65
+ ```

2

<コード>を利用した記述に修正しました。

2019/10/15 07:20

投稿

tog
tog

スコア26

title CHANGED
File without changes
body CHANGED
@@ -10,7 +10,7 @@
10
10
  |2019-04-02|9999-12-31|1|1C|
11
11
  |2018-05-02|2019-09-01|2|2A|
12
12
  |2019-09-02|9999-12-31|2|2B|
13
-
13
+ ```MySQL5.7
14
14
  CREATE TABLE `テーブルA` (
15
15
  `from_date` DATE NOT NULL,
16
16
  `to_date` DATE NOT NULL,
@@ -21,6 +21,7 @@
21
21
  COLLATE='utf8mb4_general_ci'
22
22
  ENGINE=InnoDB
23
23
  ;
24
+ ```
24
25
 
25
26
  更新情報を持ったある時点のテーブルB(170万件程度)
26
27
  |base_date(primary key)|id(primary key)|value|
@@ -28,6 +29,7 @@
28
29
  |2019-10-10|1|1D|
29
30
  |2019-10-10|2|2C|
30
31
 
32
+ ```MySQL5.7
31
33
  CREATE TABLE `テーブルB` (
32
34
  `base_date` DATE NOT NULL,
33
35
  `id` INT(11) NOT NULL,
@@ -37,6 +39,7 @@
37
39
  COLLATE='utf8mb4_general_ci'
38
40
  ENGINE=InnoDB
39
41
  ;
42
+ ```
40
43
 
41
44
  更新後のテーブルA
42
45
  |from_date|to_date(primary key)|id(primary key)|value|
@@ -48,10 +51,11 @@
48
51
  |2019-09-02|9999-12-31|2|2C|
49
52
 
50
53
  現行の更新クエリ:
54
+ ```MySQL5.7
51
55
  update [テーブルA] A
52
56
    inner join [テーブルB] B on A.id=B.id and B.base_date between A.from_date and A.to_date
53
57
  set A.value=B.value;
54
-
58
+ ```
55
59
  explain結果
56
60
 
57
61
  | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

1

ご指摘頂いた点について加筆致しました。(各テーブルのCreate及び現行クエリのexplain結果について)

2019/10/15 07:04

投稿

tog
tog

スコア26

title CHANGED
File without changes
body CHANGED
@@ -11,12 +11,33 @@
11
11
  |2018-05-02|2019-09-01|2|2A|
12
12
  |2019-09-02|9999-12-31|2|2B|
13
13
 
14
+ CREATE TABLE `テーブルA` (
15
+ `from_date` DATE NOT NULL,
16
+ `to_date` DATE NOT NULL,
17
+ `id` INT(11) NOT NULL,
18
+ `value` VARCHAR(50) NOT NULL,
19
+ PRIMARY KEY (`to_date`, `id`)
20
+ )
21
+ COLLATE='utf8mb4_general_ci'
22
+ ENGINE=InnoDB
23
+ ;
24
+
14
25
  更新情報を持ったある時点のテーブルB(170万件程度)
15
26
  |base_date(primary key)|id(primary key)|value|
16
27
  |:--|:--:|--:|
17
28
  |2019-10-10|1|1D|
18
29
  |2019-10-10|2|2C|
19
30
 
31
+ CREATE TABLE `テーブルB` (
32
+ `base_date` DATE NOT NULL,
33
+ `id` INT(11) NOT NULL,
34
+ `value` VARCHAR(50) NOT NULL,
35
+ PRIMARY KEY (`base_date`, `id`)
36
+ )
37
+ COLLATE='utf8mb4_general_ci'
38
+ ENGINE=InnoDB
39
+ ;
40
+
20
41
  更新後のテーブルA
21
42
  |from_date|to_date(primary key)|id(primary key)|value|
22
43
  |:--|:--:|--:|--:|
@@ -29,4 +50,11 @@
29
50
  現行の更新クエリ:
30
51
  update [テーブルA] A
31
52
    inner join [テーブルB] B on A.id=B.id and B.base_date between A.from_date and A.to_date
32
- set A.value=B.value;
53
+ set A.value=B.value;
54
+
55
+ explain結果
56
+
57
+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
58
+ | ---: | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | --- |
59
+ | 1 | SIMPLE | B | \N | ALL | PRIMARY,テーブルB | \N | \N | \N | 1658424 | 100.00 | \N |
60
+ | 1 | UPDATE | A | \N | ref | PRIMARY,テーブルA | PRIMARY | 202 | B.id | 916054 | 1.11 | Using where |