LoginSignup
1
0

MySQL HeatWave で動作の制限・制約がある SQL 文 (1) 変更の伝搬に関するもの

Last updated at Posted at 2023-07-30

こちらのシリーズの続きです。

MySQL HeatWave で実行できない・実行結果に差異が生じる SQL 文がいくつかあるようですので、これから試していきます。

MySQL HeatWave User Guide に記載の制限・制約事項

今回は、最初の

を確認します。

2023/7/30 時点(MySQL バージョン 8.1.0-u1-cloud)の情報です。
今後、結果などが変わる可能性があります。

1. 外部キーのCASCADEUPDATEDELETE

テーブル作成・テストデータ挿入

こんな感じで、親・子のテーブルを作成します。

mysql> CREATE DATABASE fk_test;
Query OK, 1 row affected (0.01 sec)

mysql> USE fk_test;
Database changed
mysql> CREATE TABLE fk_p (id INT NOT NULL, val INT NOT NULL, PRIMARY KEY (id));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE fk_c (id INT NOT NULL, p_id INT NOT NULL, PRIMARY KEY (id), FOREIGN KEY (p_id) REFERENCES fk_p (id) ON UPDATE CASCADE ON DELETE CASCADE);
Query OK, 0 rows affected (0.02 sec)

こちらにデータを挿入します(以下は挿入後の内容)。

mysql> SELECT * FROM fk_p ORDER BY id;
+----+-----+
| id | val |
+----+-----+
|  1 | 100 |
|  2 | 110 |
|  3 | 150 |
|  4 | 150 |
|  5 | 170 |
|  6 | 170 |
|  7 | 210 |
|  8 | 210 |
|  9 | 280 |
| 10 | 300 |
+----+-----+
10 rows in set (0.00 sec)

mysql> SELECT * FROM fk_c ORDER BY id;
+----+------+
| id | p_id |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    2 |
|  4 |    5 |
|  5 |    5 |
|  6 |    5 |
|  7 |    7 |
|  8 |    7 |
|  9 |    9 |
| 10 |   10 |
+----+------+
10 rows in set (0.00 sec)

HeatWave 有効化・データロード

セカンダリエンジンとして HeatWave を有効化します。

mysql> ALTER TABLE fk_p SECONDARY_ENGINE=RAPID;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE fk_p SECONDARY_LOAD;
Query OK, 0 rows affected (0.26 sec)

mysql> ALTER TABLE fk_c SECONDARY_ENGINE=RAPID;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE fk_c SECONDARY_LOAD;
Query OK, 0 rows affected (0.20 sec)

HeatWave へのデータロードを確認します。

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ p.id pid, p.val, c.id cid FROM fk_p p LEFT JOIN fk_c c ON p.id = c.p_id ORDER BY p.id, c.id;
+-----+-----+------+
| pid | val | cid  |
+-----+-----+------+
|   1 | 100 |    1 |
|   2 | 110 |    2 |
|   2 | 110 |    3 |
|   3 | 150 | NULL |
|   4 | 150 | NULL |
|   5 | 170 |    4 |
|   5 | 170 |    5 |
|   5 | 170 |    6 |
|   6 | 170 | NULL |
|   7 | 210 |    7 |
|   7 | 210 |    8 |
|   8 | 210 | NULL |
|   9 | 280 |    9 |
|  10 | 300 |   10 |
+-----+-----+------+
14 rows in set (0.10 sec)

DELETE実行

UPDATEDELETEの両方を確認するため、トランザクションを有効にしつつ、まずはCASCADEでよく使うであろう、DELETEから試してみます。

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM fk_p WHERE id = 5;
Query OK, 1 row affected (0.00 sec)

DELETEそのものは成功したので、あらためて HeatWave 側で SQL 文を流してみると…

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ p.id pid, p.val, c.id cid FROM fk_p p LEFT JOIN fk_c c ON p.id = c.p_id ORDER BY p.id, c.id;
ERROR 3889 (HY000): Secondary engine operation failed. Reason: "use_secondary_engine is FORCED but query could not be executed in secondary engine".

エラー(ERROR 3889 (HY000): Secondary engine operation failed.)になりました。

2023/10/14 追記:
2023/10/12 時点(MySQL バージョン 8.1.0-u4-cloud)で確認したところ、親テーブル(fk_p)のid=5に対応する子テーブル(fk_c)のid=3・4・5が HeatWave 側で削除されず残ったままになる一方で、エラーが出なくなりました。

データの不整合に気付かないままになる恐れがあるので厄介ですね。

https://speakerdeck.com/hmatsu47/mysql-heatwave-limitations-and-dms-replication?slide=7

念のため MySQL DB 側で実行してみると、

mysql> SELECT /*+ SET_VAR(use_secondary_engine=OFF) */ p.id pid, p.val, c.id cid FROM fk_p p LEFT JOIN fk_c c ON p.id = c.p_id ORDER BY p.id, c.id;
+-----+-----+------+
| pid | val | cid  |
+-----+-----+------+
|   1 | 100 |    1 |
|   2 | 110 |    2 |
|   2 | 110 |    3 |
|   3 | 150 | NULL |
|   4 | 150 | NULL |
|   6 | 170 | NULL |
|   7 | 210 |    7 |
|   7 | 210 |    8 |
|   8 | 210 | NULL |
|   9 | 280 |    9 |
|  10 | 300 |   10 |
+-----+-----+------+
11 rows in set (0.01 sec)

親テーブルのid=5が正常に削除されていて、エラーも出ません。

UPDATE実行

一旦ROLLBACK します。

mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ p.id pid, p.val, c.id cid FROM fk_p p LEFT JOIN fk_c c ON p.id = c.p_id ORDER BY p.id, c.id;
+-----+-----+------+
| pid | val | cid  |
+-----+-----+------+
|   1 | 100 |    1 |
|   2 | 110 |    2 |
|   2 | 110 |    3 |
|   3 | 150 | NULL |
|   4 | 150 | NULL |
|   5 | 170 |    4 |
|   5 | 170 |    5 |
|   5 | 170 |    6 |
|   6 | 170 | NULL |
|   7 | 210 |    7 |
|   7 | 210 |    8 |
|   8 | 210 | NULL |
|   9 | 280 |    9 |
|  10 | 300 |   10 |
+-----+-----+------+
14 rows in set (0.03 sec)

戻っていますね。

一応、UPDATEについても試してみます。

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE fk_p SET id = 11 WHERE id = 7;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT /*+ SET_VAR(use_secondary_engine=OFF) */ p.id pid, p.val, c.id cid FROM fk_p p LEFT JOIN fk_c c ON p.id = c.p_id ORDER BY p.id, c.id;
+-----+-----+------+
| pid | val | cid  |
+-----+-----+------+
|   1 | 100 |    1 |
|   2 | 110 |    2 |
|   2 | 110 |    3 |
|   3 | 150 | NULL |
|   4 | 150 | NULL |
|   5 | 170 |    4 |
|   5 | 170 |    5 |
|   5 | 170 |    6 |
|   6 | 170 | NULL |
|   8 | 210 | NULL |
|   9 | 280 |    9 |
|  10 | 300 |   10 |
|  11 | 210 |    7 |
|  11 | 210 |    8 |
+-----+-----+------+
14 rows in set (0.00 sec)

MySQL DB では普通に実行できますが、

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ p.id pid, p.val, c.id cid FROM fk_p p LEFT JOIN fk_c c ON p.id = c.p_id ORDER BY p.id, c.id;
ERROR 3889 (HY000): Secondary engine operation failed. Reason: "use_secondary_engine is FORCED but query could not be executed in secondary engine".

HeatWave ではやっぱりエラーになります。

2. time_zoneSYSTEM+00:00)以外に設定したときのTIMESTAMPUPDATE

Configurations に設定追加・テスト DB 作成

MySQL HeatWave on AWS を使い、Configurations でtime_zoneAsia/Tokyoに設定して試してみます。

2023/10/14 追記:
2023/10/12 時点(MySQL バージョン 8.1.0-u4-cloud)で確認したところ、time_zoneAsia/Tokyo形式で指定すると HeatWave 側でエラーが出るようになりました。

+09:00形式で指定する必要があります。

https://speakerdeck.com/hmatsu47/mysql-heatwave-limitations-and-dms-replication?slide=22

image.png
image.png

mysql> SELECT @@time_zone;
+-------------+
| @@time_zone |
+-------------+
| Asia/Tokyo  |
+-------------+
1 row in set (0.00 sec)

テーブル作成・テストデータ投入

テーブルを作ります。

CREATE DATABASE ts_test;
USE ts_test;
CREATE TABLE ts_test (id INT NOT NULL, val int NOT NULL, ts TIMESTAMP NOT NULL, PRIMARY KEY(id));

以下のストアドプロシージャを作成して、テストデータを投入します。

DELIMITER //

DROP PROCEDURE IF EXISTS ts_insert;
CREATE PROCEDURE ts_insert(IN record_count INT, IN start_datetime DATETIME)
BEGIN
  DECLARE cur_id INT DEFAULT 1;
  DECLARE cur_datetime DATETIME DEFAULT '2001-01-01 00:00:00';
  SET cur_datetime = start_datetime;

  loop1: LOOP
    INSERT INTO ts_test SET id = cur_id, val = cur_id, ts = cur_datetime;
    SET cur_id = cur_id + 1;
    SET cur_datetime = cur_datetime + interval 1 minute;

    IF cur_id > record_count then
      LEAVE loop1;
      END IF;
  END LOOP loop1;
END;
//

DELIMITER ;

データを投入します。

mysql> CALL ts_insert(1000000, '1990-01-01 00:00:00');

トランザクションを効かせるのを忘れたので、処理に時間が掛かってしまい、クライアントがタイムアウトしてしまいました。

データ投入後にインデックスを作成します。

mysql> ALTER TABLE ts_test ADD INDEX idx_ts(ts, val);
Query OK, 0 rows affected (4.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

MySQL DB で実行(UPDATE前)

まずはセカンダリエンジン(HeatWave)がない状態で実行してみます。

mysql> SELECT SUM(val) FROM ts_test WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);
+-------------+
| SUM(val)    |
+-------------+
|  2612756160 |
|  4789001520 |
|  6531861600 |
|  8710179120 |
| 10326549600 |
| 12631356720 |
| 14624086320 |
| 16049685600 |
| 18545263920 |
| 19844373600 |
| 22466441520 |
| 24459171120 |
| 23804948160 |
| 28251785520 |
| 29237781600 |
| 32172963120 |
| 33032469600 |
| 36094140720 |
| 38086870320 |
| 38755605600 |
| 37855661760 |
+-------------+
21 rows in set (1.04 sec)

HeatWave 有効化・HeatWave で実行(UPDATE前)

HeatWave を有効化します。

mysql> ALTER TABLE ts_test SECONDARY_ENGINE=RAPID;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE ts_test SECONDARY_LOAD;
Query OK, 0 rows affected (1.96 sec)

ロードが完了し、先ほどの SQL 文のEXPLAINを表示してみると、HeatWave で実行されることがわかります。

mysql> EXPLAIN FORMAT=TREE SELECT SUM(val) FROM ts_test WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts)\G
*************************** 1. row ***************************
EXPLAIN: -> Sort: year(ts_test.ts), month(ts_test.ts)  (cost=1202..221e+6 rows=183822)
    -> Group aggregate: sum(ts_test.val)  (cost=1066..196e+6 rows=183822)
        -> Filter: (ts_test.ts between '1990-02-01 00:00:00' and '1991-10-28 23:59:59')  (cost=95.9..88.1e+6 rows=919111)
            -> Table scan on ts_test in secondary engine RAPID  (cost=0..0 rows=919111)

1 row in set, 1 warning (0.02 sec)

HeatWave で実行してみると、

mysql> SELECT SUM(val) FROM ts_test WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);
+-------------+
| SUM(val)    |
+-------------+
|  2612756160 |
|  4789001520 |
|  6531861600 |
|  8710179120 |
| 10326549600 |
| 12631356720 |
| 14624086320 |
| 16049685600 |
| 18545263920 |
| 19844373600 |
| 22466441520 |
| 24459171120 |
| 23804948160 |
| 28251785520 |
| 29237781600 |
| 32172963120 |
| 33032469600 |
| 36094140720 |
| 38086870320 |
| 38755605600 |
| 37855661760 |
+-------------+
21 rows in set (0.15 sec)

差異がないことがわかります。

データ(TIMESTAMP列)更新

データ(TIMESTAMP列)を更新します。

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE ts_test SET ts = ts + INTERVAL 12 HOUR;
Query OK, 1000000 rows affected (8.99 sec)
Rows matched: 1000000  Changed: 1000000  Warnings: 0

mysql> SELECT * FROM ts_test WHERE id = 1;
+----+-----+---------------------+
| id | val | ts                  |
+----+-----+---------------------+
|  1 |   1 | 1990-01-01 12:00:00 |
+----+-----+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM ts_test WHERE id = 1000000;
+---------+---------+---------------------+
| id      | val     | ts                  |
+---------+---------+---------------------+
| 1000000 | 1000000 | 1991-11-26 22:39:00 |
+---------+---------+---------------------+
1 row in set (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.08 sec)

全行 12 時間後ろにずらしています。

MySQL DB で実行(UPDATE後)

mysql> SELECT /*+ SET_VAR(use_secondary_engine=OFF) */ SUM(val) FROM ts_test WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);
+-------------+
| SUM(val)    |
+-------------+
|  2583725760 |
|  4756860720 |
|  6500757600 |
|  8678038320 |
| 10295445600 |
| 12599215920 |
| 14591945520 |
| 16018581600 |
| 18513123120 |
| 19813269600 |
| 22434300720 |
| 24427030320 |
| 23775917760 |
| 28219644720 |
| 29206677600 |
| 32140822320 |
| 33001365600 |
| 36061999920 |
| 38054729520 |
| 38724501600 |
| 37826631360 |
+-------------+
21 rows in set (1.13 sec)

集計対象のデータ行が前にずれた分、集計対象行が全体的に前にずれて(valの値が小さい行が集計対象になる)、集計値が小さくなっているのがわかります。

HeatWave で実行(UPDATE後)

mysql> SELECT SUM(val) FROM ts_test WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);
+-------------+
| SUM(val)    |
+-------------+
|  2605498560 |
|  4780966320 |
|  6524085600 |
|  8702143920 |
| 10318773600 |
| 12623321520 |
| 14616051120 |
| 16041909600 |
| 18537228720 |
| 19836597600 |
| 22458406320 |
| 24451135920 |
| 23797690560 |
| 28243750320 |
| 29230005600 |
| 32164927920 |
| 33024693600 |
| 36086105520 |
| 38078835120 |
| 38747829600 |
| 37848404160 |
+-------------+
21 rows in set (0.09 sec)

差異が生じてしまいました。

2023/10/14 追記:
2023/10/12 時点(MySQL バージョン 8.1.0-u4-cloud)で確認したところ、time_zone+09:00形式で指定した状態で差異が出なくなりました。

https://speakerdeck.com/hmatsu47/mysql-heatwave-limitations-and-dms-replication?slide=22

外部キーのCASCADEUPDATEDELETE)のときとは違いエラーにならない ので、むしろ厄介ですね。

HeatWave にデータを再ロードする

一旦 HeatWave のデータをアンロードし、ロードし直します。

mysql> ALTER TABLE ts_test SECONDARY_UNLOAD;
Query OK, 0 rows affected (0.02 sec)

mysql> ALTER TABLE ts_test SECONDARY_LOAD;
Query OK, 0 rows affected (1.98 sec)

対象 SQL 文が HeatWave で実行されることをEXPLAINで確認しつつ再実行すると、正しい結果になりました。

mysql> EXPLAIN FORMAT=TREE SELECT SUM(val) FROM ts_test WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts)\G
*************************** 1. row ***************************
EXPLAIN: -> Sort: year(ts_test.ts), month(ts_test.ts)  (cost=1202..221e+6 rows=183822)
    -> Group aggregate: sum(ts_test.val)  (cost=1066..196e+6 rows=183822)
        -> Filter: (ts_test.ts between '1990-02-01 00:00:00' and '1991-10-28 23:59:59')  (cost=95.9..88.1e+6 rows=919111)
            -> Table scan on ts_test in secondary engine RAPID  (cost=0..0 rows=919111)

1 row in set, 1 warning (0.02 sec)

mysql> SELECT SUM(val) FROM ts_test WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);
+-------------+
| SUM(val)    |
+-------------+
|  2583725760 |
|  4756860720 |
|  6500757600 |
|  8678038320 |
| 10295445600 |
| 12599215920 |
| 14591945520 |
| 16018581600 |
| 18513123120 |
| 19813269600 |
| 22434300720 |
| 24427030320 |
| 23775917760 |
| 28219644720 |
| 29206677600 |
| 32140822320 |
| 33001365600 |
| 36061999920 |
| 38054729520 |
| 38724501600 |
| 37826631360 |
+-------------+
21 rows in set (0.10 sec)

DATETIME列で実行してみると

問題は発生しませんでした。

mysql> CREATE TABLE ts_test2 (id INT NOT NULL, val int NOT NULL, ts DATETIME NOT NULL, PRIMARY KEY(id));
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO ts_test2 SELECT id, val, CONCAT(ts, '+00:00') ts FROM ts_test ORDER BY id;
Query OK, 1000000 rows affected (5.34 sec)
Records: 1000000  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM ts_test2 WHERE id = 1;
+----+-----+---------------------+
| id | val | ts                  |
+----+-----+---------------------+
|  1 |   1 | 1990-01-01 00:00:00 |
+----+-----+---------------------+
1 row in set (0.00 sec)

mysql> SELECT @@time_zone;
+-------------+
| @@time_zone |
+-------------+
| Asia/Tokyo  |
+-------------+
1 row in set (0.00 sec)

mysql> EXPLAIN FORMAT=TREE SELECT SUM(val) FROM ts_test2 WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BYYEAR(ts), MONTH(ts)\G
*************************** 1. row ***************************
EXPLAIN: -> Sort: year(ts_test2.ts), month(ts_test2.ts)  (cost=1202..221e+6 rows=183822)
    -> Group aggregate: sum(ts_test2.val)  (cost=1066..196e+6 rows=183822)
        -> Filter: (ts_test2.ts between '1990-02-01 00:00:00' and '1991-10-28 23:59:59')  (cost=95.9..88.1e+6 rows=919111)
            -> Table scan on ts_test2 in secondary engine RAPID  (cost=0..0 rows=919111)

1 row in set, 1 warning (0.02 sec)

mysql> SELECT SUM(val) FROM ts_test2 WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);

+-------------+
| SUM(val)    |
+-------------+
|  2612756160 |
|  4789001520 |
|  6531861600 |
|  8710179120 |
| 10326549600 |
| 12631356720 |
| 14624086320 |
| 16049685600 |
| 18545263920 |
| 19844373600 |
| 22466441520 |
| 24459171120 |
| 23804948160 |
| 28251785520 |
| 29237781600 |
| 32172963120 |
| 33032469600 |
| 36094140720 |
| 38086870320 |
| 38755605600 |
| 37855661760 |
+-------------+
21 rows in set (0.09 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)

mysql> UPDATE ts_test2 SET ts = ts + INTERVAL 12 HOUR;
Query OK, 1000000 rows affected (9.21 sec)
Rows matched: 1000000  Changed: 1000000  Warnings: 0

mysql> COMMIT;
Query OK, 0 rows affected (0.09 sec)

mysql> EXPLAIN FORMAT=TREE SELECT SUM(val) FROM ts_test2 WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BYYEAR(ts), MONTH(ts)\G
*************************** 1. row ***************************
EXPLAIN: -> Sort: year(ts_test2.ts), month(ts_test2.ts)  (cost=4.77e+6..100e+6 rows=21)
    -> Group aggregate: sum(ts_test2.val)  (cost=4.77e+6..100e+6 rows=21)
        -> Filter: (ts_test2.ts between '1990-02-01 00:00:00' and '1991-10-28 23:59:59')  (cost=96.4..88.1e+6 rows=914400)
            -> Table scan on ts_test2 in secondary engine RAPID  (cost=0..0 rows=914400)

1 row in set, 1 warning (0.02 sec)

mysql> SELECT SUM(val) FROM ts_test2 WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);

+-------------+
| SUM(val)    |
+-------------+
|  2583725760 |
|  4756860720 |
|  6500757600 |
|  8678038320 |
| 10295445600 |
| 12599215920 |
| 14591945520 |
| 16018581600 |
| 18513123120 |
| 19813269600 |
| 22434300720 |
| 24427030320 |
| 23775917760 |
| 28219644720 |
| 29206677600 |
| 32140822320 |
| 33001365600 |
| 36061999920 |
| 38054729520 |
| 38724501600 |
| 37826631360 |
+-------------+
21 rows in set (0.09 sec)

mysql> SELECT /*+ SET_VAR(use_secondary_engine=OFF) */ SUM(val) FROM ts_test2 WHERE ts BETWEEN '1990-02-01 00:00:00' AND '1991-10-28 23:59:59' GROUP BY YEAR(ts), MONTH(ts) ORDER BY YEAR(ts), MONTH(ts);
+-------------+
| SUM(val)    |
+-------------+
|  2583725760 |
|  4756860720 |
|  6500757600 |
|  8678038320 |
| 10295445600 |
| 12599215920 |
| 14591945520 |
| 16018581600 |
| 18513123120 |
| 19813269600 |
| 22434300720 |
| 24427030320 |
| 23775917760 |
| 28219644720 |
| 29206677600 |
| 32140822320 |
| 33001365600 |
| 36061999920 |
| 38054729520 |
| 38724501600 |
| 37826631360 |
+-------------+
21 rows in set (0.90 sec)

2023/8/6 追記:
続きの記事を書きました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0