MySQL 5.7を利用しております。
下記のようなfrom-to管理テーブルをある時点のデータテーブルで更新(Update)処理をおこないたいのですが、現行のフローだとパフォーマンスが悪いです。(というよりも更新クエリが返ってこないです。)
どのような更新クエリを書けば良いでしょうか?
更新前のテーブルA(275万件程度)
from_date | to_date(primary key) | id(primary key) | value |
---|---|---|---|
2018-01-01 | 2018-04-01 | 1 | 1A |
2018-04-02 | 2019-04-01 | 1 | 1B |
2019-04-02 | 9999-12-31 | 1 | 1C |
2018-05-02 | 2019-09-01 | 2 | 2A |
2019-09-02 | 9999-12-31 | 2 | 2B |
```MySQL5.7 | |||
CREATE TABLE テーブルA ( |
`from_date` DATE NOT NULL, `to_date` DATE NOT NULL, `id` INT(11) NOT NULL, `value` VARCHAR(50) NOT NULL, PRIMARY KEY (`to_date`, `id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
更新情報を持ったある時点のテーブルB(170万件程度) |base_date(primary key)|id(primary key)|value| |:--|:--:|--:| |2019-10-10|1|1D| |2019-10-10|2|2C| ```MySQL5.7 CREATE TABLE `テーブルB` ( `base_date` DATE NOT NULL, `id` INT(11) NOT NULL, `value` VARCHAR(50) NOT NULL, PRIMARY KEY (`base_date`, `id`) ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ;
更新後のテーブルA
from_date | to_date(primary key) | id(primary key) | value |
---|---|---|---|
2018-01-01 | 2018-04-01 | 1 | 1A |
2018-04-02 | 2019-04-01 | 1 | 1B |
2019-04-02 | 9999-12-31 | 1 | 1D |
2018-05-02 | 2019-09-01 | 2 | 2A |
2019-09-02 | 9999-12-31 | 2 | 2C |
現行の更新クエリ:
MySQL5.7
1update [テーブルA] A 2 inner join [テーブルB] B on A.id=B.id and B.base_date between A.from_date and A.to_date 3set A.value=B.value;
explain結果
MySQL5.7
1| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | 2| ---: | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | --- | 3| 1 | SIMPLE | B | \N | ALL | PRIMARY,テーブルB | \N | \N | \N | 1658424 | 100.00 | \N | 4| 1 | UPDATE | A | \N | ref | PRIMARY,テーブルA | PRIMARY | 202 | B.id | 916054 | 1.11 | Using where |
質問に 2つのテーブルのCREATE TABLE, CREATE INDEX を https://teratail.com/help/question-tips#questionTips3-7 の [コード] で追記してください。
ありがとうございます。
追記致しました。
update, explain も https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。
explain も。
これ以上は有料にします。笑
回答2件
あなたの回答
tips
プレビュー