ASMのきもち

DBとAnsibleが気になって仕方ない人のブログ

MySQLのリファレンスを読む 1章の続き その⑨

まいえすきゅーえりたい ぽすぐれない おらくるってる(狂ってる)tomoです。

やるぞやるぞ詐欺を経て、ようやく戻ってまいりました!
あぁMySQL、寂しかったよMySQL
ちょっと登壇したり、社内のごにょごにょしたり、Oraくるってました。
speakerdeck.com


もうMySQLばっかりで、ええんやで←

今日もこれの続き。
tomomo1015.hatenablog.com


今日読んだもの
1.3 MySQL 8.0 の新機能
ここの「SQL 標準の明示的なテーブル句およびテーブル値コンストラクタ」から。

  • SQL 標準に従って、テーブル値コンストラクタや明示的なテーブル句が追加されました、と。
    • 例のこれが私的にわかりやすかった。SQL標準だとこんな感じで「TABLE t2」だけでまとめられるのかぁ。便利
    • これは 各ステートメントのリファレンスちゃんと読んだ方が良さそう
    • 論点ずれますが、DBによってSQL方言って結構あるんだなぁとしみじみ
--- 以下2つは同じSQL文
SELECT a FROM t1 WHERE b > ANY (TABLE t2) ;
SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2) ;
  • インデックスレベルのオプティマイザヒント!ほぼ毎月どこかでやってる「このINDEX使ってねー」というオプティマイズヒント句
    • 注意すべきは「これらのオプティマイザヒントは、将来の MySQL リリースで非推奨になり、その後 MySQL から削除する予定の FORCE INDEX および IGNORE INDEX を置き換えることを目的としています。」とあるので、FORCE INDEXはGROUP_INDEXに、 IGNORE INDEX はNO_GROUP_INDEXに変えていってね、というこでいいかな。
--- (i_a, i_b, i_c) にはインデックスマージが使用されるパターン
SELECT /*+ INDEX_MERGE(t1 i_a, i_b, i_c)*/ * FROM t1
  WHERE b = 1 AND c = 2 AND d = 3;
  • JSON_VALUE() 関数が増えたよ。これはJSON カラムのインデックス付けを簡略化するためのもの…ほうほう?
    • これ、マニュアルに書いてあるSQLをそのまま流してみたんだけど…あれ?8.1だから??
    • このあたり正直不慣れすぎるので、ちょうどいいつまり方したかも。
mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 8.1.0     |
+-----------+
1 row in set (0.00 sec)

mysql>

mysql> CREATE TABLE t1(
    ->     j JSON,
    ->     INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) )
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT name, price FROM t1
    ->     WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;
ERROR 1054 (42S22): Unknown column 'name' in 'field list'

mysql> select * from t1;
+--------------------------------------------------+
| j                                                |
+--------------------------------------------------+
| {"id": "123", "name": "shoes", "price": "49.95"} |
+--------------------------------------------------+
1 row in set (0.00 sec)

mysql>

という、ここで詰まって今日はタイムアウト。明日このエラーの原因調べようと思います…!