MySQL Technology Cafe #5に参加してきた

MySQL Technology Cafe #5に参加してきました。 せっかくなので感想を書いていきたいと思います。 今回は2人発表してくださいました。

oracle-code-tokyo-dev.connpass.com

題目

  • 1人目:MySQL8.0の便利機能とSQL標準
  • 2人目:MySQL Binlogパケットと自作クライアント

MySQL8.0の便利機能

ラクルのMySQLのサポートの方の発表で、MySQL8.0の新機能の普段あんまり取り上げないものをピックアップしていました。

C言語の非同期API

8.0.16でサポートされたらしいです。 普段仕事でC言語は触ることないですが、C言語を使用しながらDBはMySQLを使う人はオプションとして知っていてもいいかもと思いました。 中身の非同期の実装はどうなってるかというと、クエリの処理が終わらない間は他の処理を実行しつつ、処理が終わったかどうかの確認は愚直にポーリングしているらしい。

EXPLAINのTree表示

今までのEXPLAINは単純に表として結果を出力していたが、explain format=tree select * from ...のようにクエリの頭に指定してやると、tree構造でEXPLAINが表示される。どこかで見たことあるフォーマットだなと思ったらOracleのEXPLAINにそっくり。

CREATE USERのパスワードオプション

ユーザを作成する際に、パスワードオプションを一緒に設定できるらしい。例えば以下のように。

  • xx世代前までのパスワードは再利用できない
  • 過去に利用した同じパスワードはyy日たたないと使えない

パスワード変える側からするとめんどくさいけど、やっておいて損はなさそう。

新しいコレーションutf8mb4_0900_bin

MySQL8.0.17でサポートされたらしい。 MySQLの文字列比較は「空白埋め」。例えば、'a'='a 'は一致する。 しかし、utf8mb4_0900_binは「空白埋め」とは限らなくなった。混在させると何か踏みそうですね。

ここまでが、MySQL8.0の新機能でした。

SQL標準

どういう言葉が正しいか分かりませんが、SQLの規格?をSQL標準と呼ぶらしいです。イメージとしてはすべてのDBMSで同じ動きをする構文が定められてる感じ。あると言われればそうだろうなと思ったのですが、SQL標準というものの存在を知らなかった...。 SQL標準を参考に最近MySQLに実装されたもの。

  • ストアドオブジェクト
  • 共通表式(CTE)
  • ウインドウ関数
  • CHECK句
  • 生成列

MySQLからのアプローチで、SQL標準に取り込まれたり、取り込まれないにしてもデファクトとなった機能。

  • GROUP_CONCAT()関数
  • LIMIT句
  • DMLとしてのREPLACE,INSERT...ON CONFLIT...
  • バルクインサート

SQL標準からMySQLに実装されたものをいくつかピックアップ。

CTE(共通表式)

以下のようにクエリに名前をつけることができる機能。

WITH t AS (
        SELECT hoge, fuga
        FROM a, b
        WHERE a.id = b.id
)
SELECT * FROM t WHERE ...

メリットとしては、サブクエリや再帰クエリなどをスッキリ書ける。超長いクエリの時は便利かも。

ウインドウ関数

何かのランキングで上位3位までを出したいとき、MySQLではLIMIT句が使えそうだが、同率3位がいる場合は全員出したいとなると3レコードではすまない。そういう時にウインドウ関数でランクをうまく表示できる。

WITH add_rank AS(
SELECT 
        RANK() OVER (ORDER BY hoge) AS rank_num, id, name
FROM 
        fuga
)
SELECT
        *
FROM
        add_rank
WHERE
        rank_num <= 3;

SQL標準が進むとこのへんをデータベースごとに違いがでなくてすむのがいいですねという話でした。

MySQL Binlogパケットと自作クライアント

お二方目、mysqlmysql-clientの間のパケットのやりとりをwiresharkのスクショとともに説明していただいたあとに、binlogに出力する前のパケットのやりとりをrubyで書かれたプログラムでパースして表示するデモをしてくださいました。mysqlのパケットのやりとりは初めて見ましたが、そこまで難しいことはしていなさそうで、ちょっとのぞいてみようかなという気持ちになりました。あと、あまり発表の本題とは関係していなくて恐縮ですが、個人的にはmysqlのパスワードを生成している方法が、そんなにする?ってほどsha1かませまくっていたのをすごく覚えています笑。なかなかギークな発表で面白かったです。発表された方のプログラムを載せておきますので、見たいかたはどうぞ。 github.com

まとめ

  • MySQL Technology Cafe #5(2019/08/27)に参加してきました
  • 知らない機能が多かったですが、知ると使えそうな機能がいくつかありました。8.0.15からは新機能がぐぐっと増えてるらしいので、自分でも調べてみようという気になりました。
  • パケットの実装はmysqlの中身の理解の一助となりそうだなと感じたので参考にしたいです。

以上が勉強会の感想でした!