質問編集履歴

3

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

2019/10/15 07:20

投稿

tog
tog

スコア26

test CHANGED
File without changes
test CHANGED
@@ -116,7 +116,7 @@
116
116
 
117
117
  explain結果
118
118
 
119
-
119
+ ```MySQL5.7
120
120
 
121
121
  | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
122
122
 
@@ -125,3 +125,5 @@
125
125
  | 1 | SIMPLE | B | \N | ALL | PRIMARY,テーブルB | \N | \N | \N | 1658424 | 100.00 | \N |
126
126
 
127
127
  | 1 | UPDATE | A | \N | ref | PRIMARY,テーブルA | PRIMARY | 202 | B.id | 916054 | 1.11 | Using where |
128
+
129
+ ```

2

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

2019/10/15 07:20

投稿

tog
tog

スコア26

test CHANGED
File without changes
test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  |2019-09-02|9999-12-31|2|2B|
24
24
 
25
-
25
+ ```MySQL5.7
26
26
 
27
27
  CREATE TABLE `テーブルA` (
28
28
 
@@ -44,6 +44,8 @@
44
44
 
45
45
  ;
46
46
 
47
+ ```
48
+
47
49
 
48
50
 
49
51
  更新情報を持ったある時点のテーブルB(170万件程度)
@@ -57,6 +59,8 @@
57
59
  |2019-10-10|2|2C|
58
60
 
59
61
 
62
+
63
+ ```MySQL5.7
60
64
 
61
65
  CREATE TABLE `テーブルB` (
62
66
 
@@ -75,6 +79,8 @@
75
79
  ENGINE=InnoDB
76
80
 
77
81
  ;
82
+
83
+ ```
78
84
 
79
85
 
80
86
 
@@ -98,13 +104,15 @@
98
104
 
99
105
  現行の更新クエリ:
100
106
 
107
+ ```MySQL5.7
108
+
101
109
  update [テーブルA] A
102
110
 
103
111
    inner join [テーブルB] B on A.id=B.id and B.base_date between A.from_date and A.to_date
104
112
 
105
113
  set A.value=B.value;
106
114
 
107
-
115
+ ```
108
116
 
109
117
  explain結果
110
118
 

1

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

2019/10/15 07:04

投稿

tog
tog

スコア26

test CHANGED
File without changes
test CHANGED
@@ -24,6 +24,28 @@
24
24
 
25
25
 
26
26
 
27
+ CREATE TABLE `テーブルA` (
28
+
29
+ `from_date` DATE NOT NULL,
30
+
31
+ `to_date` DATE NOT NULL,
32
+
33
+ `id` INT(11) NOT NULL,
34
+
35
+ `value` VARCHAR(50) NOT NULL,
36
+
37
+ PRIMARY KEY (`to_date`, `id`)
38
+
39
+ )
40
+
41
+ COLLATE='utf8mb4_general_ci'
42
+
43
+ ENGINE=InnoDB
44
+
45
+ ;
46
+
47
+
48
+
27
49
  更新情報を持ったある時点のテーブルB(170万件程度)
28
50
 
29
51
  |base_date(primary key)|id(primary key)|value|
@@ -33,6 +55,26 @@
33
55
  |2019-10-10|1|1D|
34
56
 
35
57
  |2019-10-10|2|2C|
58
+
59
+
60
+
61
+ CREATE TABLE `テーブルB` (
62
+
63
+ `base_date` DATE NOT NULL,
64
+
65
+ `id` INT(11) NOT NULL,
66
+
67
+ `value` VARCHAR(50) NOT NULL,
68
+
69
+ PRIMARY KEY (`base_date`, `id`)
70
+
71
+ )
72
+
73
+ COLLATE='utf8mb4_general_ci'
74
+
75
+ ENGINE=InnoDB
76
+
77
+ ;
36
78
 
37
79
 
38
80
 
@@ -61,3 +103,17 @@
61
103
    inner join [テーブルB] B on A.id=B.id and B.base_date between A.from_date and A.to_date
62
104
 
63
105
  set A.value=B.value;
106
+
107
+
108
+
109
+ explain結果
110
+
111
+
112
+
113
+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
114
+
115
+ | ---: | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | --- |
116
+
117
+ | 1 | SIMPLE | B | \N | ALL | PRIMARY,テーブルB | \N | \N | \N | 1658424 | 100.00 | \N |
118
+
119
+ | 1 | UPDATE | A | \N | ref | PRIMARY,テーブルA | PRIMARY | 202 | B.id | 916054 | 1.11 | Using where |