MySQL道普請便り

第100回 「MySQL道普請便り」と探るMySQLの進化

この記事を読むのに必要な時間:およそ 3 分

2015年9月に始まったこの「MySQL道普請便り」の連載も,ついに100回の大台を迎えることとなりました。

ここまで続けて来られたのは,もちろん読者のみなさまと,なんでそんなことできるんだよという斬新な驚きを提供してくれるMySQLのおかげです。本当にありがとうございます。

連載開始当時のMySQLの最新版はMySQL 5.6.26,2019年6月現在の最新版であるMySQL 8.0.16からはなんと2世代も前のリリース系列になります。せっかく100回というキリ番をゲットしたことですし,今回はMySQL道普請便りの執筆陣が普請してきた「道」を振り返りたいと思います。※1

※1)
「道普請(みちぶしん)⁠とは,みちづくりの古風な言い方です。MySQLを使ったアプリ開発・運用をみちづくりになぞらえ,本連載ではこれらに関するノウハウをご紹介していきます連載のトップより)⁠

バージョンで振り返る「道」

MySQL道普請便りの記事では,サンプルのSQLや実行結果を示す際に「サンプル環境としてMySQL x.x.xxを利用しています」のような記述がたびたび登場します。

基本的には執筆時点での最新版のMySQLをサンプル環境に選んでいますが,その記述の中から特筆に値しそうな回を集めてみました。まずは表をご覧ください。

公開日 MySQL タイトル
2 2015/9 5.6.26 MySQLにはじめてのデータを入れてみる
5 2015/10 5.6.27, 5.7.8(RC) Dockerで複数バージョンのMySQLを開発環境に用意する
8 2015/12 5.6.26, 5.7.9 MySQLのバージョン体系を知る
31 2016/10 8.0.0(DMR) MySQLのオプションファイル my.cnfの豆知識[その1]
73 2018/6 5.7.22 RubyからMySQLを操作してみる
74 2018/6 8.0.11 さまざまなMySQLのバージョンを試す
76 2018/7 5.7.9, 8.0.11 MySQL 8.0へのアップグレード

第1回はMySQL特定のバージョンに関する話題ではありませんでしたので,⁠サンプル環境」が初めて姿を現すのは第2回です。当時はまだMySQL 5.6系が最新版でした。

第5回の時点では最新版はMySQL 5.6系でしたが,⁠Dockerイメージを使ってRC(リリース候補版)を試すことができます」というテイストの記事だったため,ここで初めて「最新版(製品版,GA版)以外のMySQL」⁠⁠MySQLの(Docker公式※2の)Dockerイメージ」が登場しました。

第8回ではMySQL 5.7がリリースされたことを記念して,今までの5.6環境をどのような手順で5.7にバージョンアップするべきかを紹介しました。後に8.0としてリリースされる「MySQL 5.7の次のバージョン」は,この時点では5.8として触れられています(後にバージョン番号が再考されて8.0系になります)⁠

それ以降,MySQL 5.7系のサンプル環境が続きますが,1年ほど経った第31回にまるで何も関係のなさそうなタイトルでMySQL 8.0.0の話題が出てきます。

さらに月日は流れ第73回,つい先日(2018年4月19日)⁠MySQL 8.0もGAになりましたが,今回は5.7を利用して という記述でMySQL 8.0がリリースされた記述が現れます。続く第74回ではdbdeployerを使ってMySQL 8.0.11を起動させる様子が紹介されています。

表の最後に,第76回でMySQL 5.7からMySQL 8.0へのバージョンアップについて紹介しました。この回以降,サンプル環境としてはメインでMySQL 8.0系が使われることになります。

※2)
2019年6月現在,Docker Hubには大きく2つの公式なMySQLのイメージ」がホストされており,一方はDocker社が「Docker Hub公式」として提供しているMySQLもう一方はMySQL開発チームが「MySQL公式」として提供しているMySQLです。後者はMySQL開発チームがDocker Hubをユーザーとして利用しているため,URLなどは一般ユーザーのそれに準じています。

タグから振り返る「道」

MySQL道普請便りの記事には「タグ」がつけられています。これは執筆陣がつけたものではなく編集さんがつけてくれたものですが,せっかくなのでこれを集計してみたいと思います。

なお,以下に例示するクエリーはMySQL 8.0.16をサンプル環境としています。まずは単純な(?)トップ10から見ていきましょう。

mysql> WITH sum_count AS (SELECT word, COUNT(*) AS count FROM word GROUP BY word),
    ->      ranked AS (SELECT RANK() OVER (ORDER BY count DESC) AS r, word, count FROM sum_count)
    ->
    -> SELECT * FROM ranked WHERE r <= 10 ORDER BY r;
+---+--------------------------+-------+
| r | word                     | count |
+---+--------------------------+-------+
| 1 | MySQL                    |    99 |
| 2 | レプリケーション         |    14 |
| 3 | バックアップ             |     4 |
| 3 | InnoDB                   |     4 |
| 5 | mysqldump                |     3 |
| 5 | SQL文                    |     3 |
| 5 | トランザクション         |     3 |
| 5 | my.cnf                   |     3 |
| 5 | RBR                      |     3 |
| 5 | SBR                      |     3 |
| 5 | テーブル                 |     3 |
| 5 | SQL                      |     3 |
| 5 | MySQL 8.0                |     3 |
+---+--------------------------+-------+
13 rows in set (0.01 sec)

連載が始まったころとは違い,今のMySQLは RANK関数 を使って同率の順位を計算できます。便利ですね。

トップは当然「MySQL」で,これは全ての記事(第1回~第99回)に含まれています。

次いで「レプリケーション」の記事が14件,⁠バックアップ」, ⁠InnoDB」が4回ずつと続きます。やはりMySQLの機能としてレプリケーションの解説は欠かせないということでしょうか。

MySQL と,各年度ごとの出現回数が1回のみのタグを除いた各年のトップ3などを出力してみます。

mysql> WITH year_sum AS (SELECT YEAR(date) AS y, word, COUNT(*) AS c FROM word JOIN publish_date USING(num) JOIN author USING(num) GROUP BY y, word),
    ->      summary AS (SELECT y, RANK() OVER (PARTITION BY y ORDER BY c DESC) AS r, word, c FROM year_sum WHERE word <> 'MySQL' AND c > 1)
    ->
    -> SELECT y, r, word, c FROM summary WHERE r <= 3 ORDER BY y, r;
+------+---+-----------------------------------+---+
| y    | r | word                              | c |
+------+---+-----------------------------------+---+
| 2015 | 1 | SQL                               | 3 |
| 2016 | 1 | レプリケーション                  | 4 |
| 2016 | 2 | Linux                             | 2 |
| 2016 | 2 | ER図                              | 2 |
| 2016 | 2 | MySQL Workbench                   | 2 |
| 2016 | 2 | 死活監視                          | 2 |
| 2016 | 2 | アカウント                        | 2 |
| 2016 | 2 | 負荷テスト                        | 2 |
| 2016 | 2 | GTID                              | 2 |
| 2016 | 2 | my.cnf                            | 2 |
| 2017 | 1 | レプリケーション                  | 2 |
| 2017 | 1 | ドキュメント                      | 2 |
| 2017 | 1 | リファレンスマニュアル            | 2 |
| 2017 | 1 | 文字列型                          | 2 |
| 2017 | 1 | バックアップ                      | 2 |
| 2017 | 1 | データベース                      | 2 |
| 2017 | 1 | トランザクション                  | 2 |
| 2018 | 1 | レプリケーション                  | 5 |
| 2018 | 2 | InnoDB                            | 2 |
| 2018 | 2 | MySQLモード                       | 2 |
| 2018 | 2 | テーブル                          | 2 |
| 2018 | 2 | Ruby                              | 2 |
| 2018 | 2 | ファンクション                    | 2 |
| 2018 | 2 | プロシージャ                      | 2 |
| 2019 | 1 | レプリケーション                  | 3 |
| 2019 | 2 | MySQL 8.0                         | 2 |
+------+---+-----------------------------------+---+
26 rows in set (0.00 sec)

レプリケーション は2015年を除いて1位をキープし続けていました。強いですね。というかそれ以外のタグが複数年度に2回以上登場した形跡がないのがびっくりでした。

2016年はMySQL公式のGUIツールであるMySQL Workbenchや死活監視,アカウント管理などの基礎的な運用TIPS,2017年にはリファレンスマニュアルに関する話題やトランザクションといった基礎的だけれども実は知らないことがありそうなTIPS,2018年にはSQLモードやRuby,ファンクションやプロシージャといった運用よりは開発寄りのTIPSが傾向としてあったようです。

まとめ

MySQL道普請便りは無事100回を迎えました。今後ともMySQLとMySQL道普請便りをどうぞよろしくお願いいたします。

著者プロフィール

yoku0825

GMOメディア株式会社のDBA。日本MySQLユーザ会員。主に地雷担当。主食はMySQLだがPercona Server,MariaDB,InfiniDBにMroongaストレージエンジンなど,mysqldでありさえすれば雑食。

Twitter:@yoku0825