MySQL 8.0 が DMR／RC だった頃に試した機能について振り返ってまとめてみる

これは **[MySQL Casual Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mysql-casual)** 23 日目の記事です。

昨日（22 日目）は okumurakengo さんでした。

 * **[100行ぐらいのSQLをLaravelのEloquent/Query Builderで頑張る](https://qiita.com/okumurakengo/items/0670ce39d758ed65e8e7)**

---

個人的に、MySQL 8.0 の頃に色々な機能を試してきたので、ここらで振り返りを。

## AUTO_INCREMENT

 * **[MySQL 8.0でInnoDBのAUTO_INCREMENT問題解消を確認してみる](https://qiita.com/hmatsu47/items/4429171c1bbaba564774)**

記念すべき（？）MySQL 8.0 に関する「やってみた」の最初の投稿です。
MySQL（InnoDB）では、AUTO_INCREMENT の最後の発行値を保持していなかったので、再起動などをするとそれが失われて「保存されているレコードの最大値 +1」に戻ってしまっていたのですが、MySQL 8.0 ではそれが改善されたよ、という話です。

余談ですが、MySQL 5.6 ベースの Amazon Aurora では、Serverless でもこの問題は解消されていないようで…。

 * **[小ネタ／Aurora Serverlessの一時停止、およびAurora MySQLのフェイルオーバとAUTO_INCREMENT巻き戻り問題](https://qiita.com/hmatsu47/items/d9c2457457f0ff7ac8b0)**

## テーブルスペース・ログの暗号化

 * **[MySQL 8.0.4 RCでテーブルスペース暗号化＋REDOログ／UNDOログ暗号化](https://qiita.com/hmatsu47/items/1c6252c9a4b98dc936b1)**

最初、8.0.1(DMR) の頃に記事を書き、8.0.2 → 8.0.3(RC) → 8.0.4 と内容を更新していきました。
なお、GA となった 8.0.13 では一般テーブルスペースの暗号化もサポートしました。

 * **[MySQL 8.0.13 で一般テーブルスペース（General Tablespace）を暗号化する](https://qiita.com/hmatsu47/items/f3519532c134ba0018af)**

そろそろバイナリログの暗号化もサポートされそうですね。

## ウィンドウ関数（Window Functions）・共通テーブル式（CTE : Common Table Expressions）

 * **[MySQL 8.0.2 DMRでウィンドウ関数がサポートされたので、RANK関数を試してみる](https://qiita.com/hmatsu47/items/6cc0e69f3895f3e4a486)**
 * **[MySQL 8.0.2 DMRでウィンドウ関数その２ 少しだけ集計・分析っぽいことをしてみる](https://qiita.com/hmatsu47/items/7976e81100604f8984d2)**

集計や分析に便利なウィンドウ関数の紹介記事です。最初にみんな大好き RANK 関数、次に少しだけ細かい使い方にチャレンジしました。
また、登場順とは逆になりましたが、共通テーブル式（CTE）についても書きました（再帰 CTE が便利）。

 * **[いまさらMySQL 8.0で共通テーブル式（CTE : Common Table Expressions）
](https://qiita.com/hmatsu47/items/01211556089b19913d05)**

こういうときに例に使うデータは、その時代の話題・流行や、本人の趣味であることが多いので、後から見返すと「なにこのデータ？」となりがちですね（？）。

## ロール

 * **[MySQL 8.0（8.0.2）DMRでロールを使う (1) 基本編](https://qiita.com/hmatsu47/items/e4a49d32685220d492a9)**
 * **[MySQL 8.0（8.0.2）DMRでロールを使う (2) 8.0.2追加機能を中心に](https://qiita.com/hmatsu47/items/0cf831b6a39086dfdb0e)**

事故防止とユーザ毎のアクセス権設定の手間を（ある程度）省くのに便利なロール（Role）です。
全体像がよくわからない方、お馴染み yoku0825 さんのこちらの記事にまとめがあります。

 * **[MySQLのロール周りのあれこれ](https://yoku0825.blogspot.com/2018/10/mysql.html)（日々の覚書）**

## オプティマイザ関連

 * **[MySQL 8.0.3 RCでオプティマイザのヒストグラム統計を使う](https://qiita.com/hmatsu47/items/3cfc6762bca766c5d9a1)**

MySQL 8.0 の新機能に「ヒストグラム」が 2 つあって混乱しがちですが、こちらはオプティマイザが SQL を実行するときの判断に使うほうのオプティマイザ統計情報の話です。
結合（JOIN）でうまく使う方法が見出せなかったのが残念（できるらしいのですが）。

また、SQL の実行時間は「取ってくるデータがバッファプールに載っているかどうか」に大きく影響されるのでこちらの件はもうちょっと話題になるかな？と思ったのですが、なりませんね…。

 * **[MySQL 8.0ではオプティマイザがバッファプールに載っているデータを意識するようになった](https://qiita.com/hmatsu47/items/d53b0471c8f279130114)**

もっとも、オプティマイザの判断の結果、特定のデータがいつまでもバッファプールに載らない、という「副作用」が生じる可能性もありますが。

## 降順 INDEX

 * **[いまさらMySQL 8.0で降順INDEX](https://qiita.com/hmatsu47/items/8c5e7abe204f7ecc5084)**

これまで MySQL では無視され続けた INDEX 作成時の降順指定がようやく有効になりました。
といっても、単独の INDEX を降順にしても大して性能に影響はないので、複合 INDEX で使うことが前提になりそうですね。

なお、本題からは外れますが、降順 INDEX でのロック動作の変化についてこちらの記事の最後のほうで言及しています。

 * **[MySQL のロックについて補足（注：すでに語りつくされている内容です）](https://qiita.com/hmatsu47/items/f5eb64428494686d4ad3)**

## キーワードと予約語

 * **[MySQLのキーワードと予約語](https://qiita.com/hmatsu47/items/a1da0e06f0597acd6502)**

MySQL 8.0 で埋め込まれた「地雷」の話です（バージョンアップあるある）。
なお、yoku0825 さんのこの話を発端に、公式リファレンスマニュアルにこのバージョン間比較が追加されたとか…？

 * **[Chapter 2 Keywords and Reserved Words](https://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-keywords.html)（MySQL Server Version Reference）**

## GIS

 * **[「地球が丸いということを知った」MySQL 8.0で距離を計算してみる](https://qiita.com/hmatsu47/items/97839fd9c3db1d2e9557)**

このへんは「よくわからないけどやってみた」話です。
その後、MySQL ユーザ会の sakaik さんが「平成の伊能忠敬」として全国行脚を…？

 * **[RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2018](https://qiita.com/advent-calendar/2018/rdbms_gis)**

こちらの Advent Calendar にいろいろ取り上げられています。

## ロック状態の確認

 * **[MySQL 5.7と8.0でロック状態を確認する（sys.innodb_lock_waitsビュー）](https://qiita.com/hmatsu47/items/607d176e885f098262e8)**

MySQL 8.0 で「過去バージョンでいつも使っていたテーブル」が変更になった話です。
これ、大した情報を書いていない割に、私の Qiita 記事の中では PV が多い記事です。
その後、これを使って実際に解析してみたのがこの記事です。

 * **[「MySQL8.0 で起こる謎のデッドロックの条件を調べてみた」を data_locks・data_lock_waits テーブルで確かめてみた](https://qiita.com/hmatsu47/items/b49bc18d49da5c6029e5)**

## SQL 統計情報

 * **[MySQL 8.0（8.0.3 RC以降）でpt-query-digestっぽいSQL統計情報を大雑把に見てみる](https://qiita.com/hmatsu47/items/075d8c4f19f7d75a605b)**
 * **[MySQL 8.0でSQL実行時間の分布（ヒストグラム）を確認する](https://qiita.com/hmatsu47/items/2e4f7c4a09e4c6d4efe6)**

「もう 1 つのヒストグラム」、SQL 実行時間の分布と、その元となる統計情報の収集についての記事です。
因みに、業務では MySQL 8.0 を使っていないので pt-query-digest には大変お世話になっております。

## おまけ／GA 後に試した機能

 * **[MySQL 8.0.11 GAリリース記念／くだらない小ネタ（STATEMENT_DIGEST）](https://hmatsu47.hatenablog.com/entry/2018/04/19/230021?_ga=2.119316427.39757947.1545400669-966810755.1502591900)**

1 つ↑関連のおまけ記事です。

 * **[MySQL 8.0（8.0.12以降）で更新処理に対応したQuery Rewrite Pluginを使ってみる](https://qiita.com/hmatsu47/items/a43db9fb8c0504f15a79)**

イタズラはほどほどに…。

 * **[MySQL 8.0.13 で Skip Scan Range Access Method を試してみる](https://qiita.com/hmatsu47/items/d83bda0360728d4f585a)**

意外と使える…？

## おまけ 2／これ書いてない！を思いつく範囲で

 * 認証まわり（Caching SHA-2 Pluggable Authentication とか）
 * JSON 関連（`JSON_TABLE()`とか）
 * レプリケーション／InnoDB Cluster 関連
 * その他 SSL/TLS ライブラリ変更、`SET PERSIST`などなど

---

以上、MySQL 8.0 が DMR／RC だった頃に試した機能の振り返りでした。

MySQL 8.0 から「GA になってもどんどん機能追加していくぞ！」宣言が公式に出たので（以前のバージョンでそれがなかった、とは言わない）、おそらくこれからも機能追加が進んでいくのでしょう。

---

明日、24 日目はi_rethi さんです。

 * **[Dimitriさんのブログを読んでみよう](http://hiroi10.hatenablog.com/entry/2018/12/24/000138)（hiroi10のブログ）**

---

 * **[Qiitaに投稿したMySQL 8.0関連記事](https://hmatsu47.hatenablog.com/qiita_mysql80?_ga=2.116134852.39757947.1545400669-966810755.1502591900)**