MySQL 5.7の次のMySQL 8.0はど
んなものになるだろう
MySQL先⽣の次回作はおそらく4⽉中旬
2017/03/10
yoku0825
OSC 2017 Tokyo/Spring
\こんにちは/
yoku0825@とある企業のDBA
オラクれない-
ポスグれない-
マイエスキューエる-
⽣息域
Twitter: @yoku0825-
Blog: ⽇々の覚書-
MyNA ML: ⽇本MySQLユーザ会-
MySQL Casualʼs Slack: MySQL Casual-
1/60
このスライドのゴール
MySQL 8.0に興味のある⼈を増やす
今からMySQL 8.0にワクワクしてもらう
2/60
このスライドに記載された⾒
解は個⼈の意⾒であり、所属
する組織または所属しない組
織またはNULLの意⾒を ⼀切
代表するわけがありません
3/60
MySQL 8.0に⾄るまでのみちのり
< MySQL 5.1
MySQL 5.1
MySQL 5.5
MySQL 5.6
MySQL 5.7
MySQL 8.0
4/60
< MySQL 5.1
もうやめて俺のライフはゼロよ
5/60
MySQL 5.1
パーティション
⾏ベースレプリケーション( binlog_format )
ストレージエンジンプラグインAPI
イベントスケジューラー
テーブル形式ロギング
6/60
MySQL 5.5
認証プラグイン
InnoDBのデフォルトストレージエンジン化
準同期レプリケーションプラグイン
utf8mb4の導⼊
7/60
MySQL 5.6
InnoDB FTS, InnoDB GIS
InnoDBオンラインALTER TABLE
InnoDB Memcached Plugin
performance̲schemaの強化
GTIDの導⼊
DATETIME型のマイクロ秒対応
マルチスレッドスレーブ
クラッシュセーフスレーブ
8/60
MySQL 5.7(1)
アカウント管理の強化
暗黙のテンポラリーテーブルのInnoDB化
⽇本語対応InnoDB FTS, InnoDB GISの空間インデックス
サポート
InnoDBバッファプールオンラインリサイズ
InnoDBテーブルスペース暗号化
JSONデータ型, JSON関数
9/60
MySQL 5.7(2)
Generated Column(式インデックス的な)
マルチソースレプリケーション
GTIDのオンライン有効化
MySQL X Protocol
Group Replication
オプティマイザーヒント構⽂のサポート
10/60
MySQL 8.0(1)
mysql スキーマのMyISAM撲滅
ロールのサポート
utf8mb4 がUnicode 9.0.0ベースの照合順序をサポート
( utf8mb4_*_ai_ci の誕⽣)
utf8mb4_unicode_900_ai_ci のデフォルト化
SET PERSIST / RESET PERSIST 構⽂のサポート
InnoDBデータディクショナリー( *.frm ファイルがなくな
る)
11/60
MySQL 8.0(2)
column̲statsのサポート
パーティションストレージエンジンの削除(InnoDBネイテ
ィブパーティション)
降順インデックス( KEY idx̲name ( column̲name
DESC ) )のサポート
共通テーブル式(CTE)のサポート(WITH / WITH RECURSIVE
句)
SELECT .. NOWAIT , SELECT .. SKIP LOCKED 構⽂のサ
ポート
InnoDBログ、InnoDB UNDOスペースの暗号化
Window Function ︕︖ (未実装)
12/60
MySQL 8.0(3)
InnoDBのAUTO̲INCREMENTがInnoDBログに記録される
ように
INFORMATION̲SCHEMA.INNODB̲CACHED̲INDEXES
SET GTID_PURGED ="+gtid_set" 構⽂のサポート
RBRの進捗状況をperformance̲schemaで確認可能に
変な構⽂でカラム名エイリアスがつけられるようになった
( SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c,
d); )
さよなら mysql̲install̲db
INNODB̲LOCKS, INNODB̲LOCK̲WAITS が
information̲schemaからperformance̲schemaへ移動
13/60
参考
MySQL :: MySQL 8.0 Release Notes
MySQL :: MySQL 8.0 Reference Manual :: 1.5 Server
and Status Variables and Options Added, Deprecated,
or Removed in MySQL 8.0
14/60
増えるわ
増える
15/60
イマココ
5.1
5.1 5.5 5.6 5.7
5.1, 5.2, 5.3 5.5 10.0 10.1 10.2
5.5 5.6 5.7 8.0
Percona Server
MySQL
MariaDB
16/60
ツギココ
5.1
5.1 5.5 5.6 5.7
5.1, 5.2, 5.3 5.5 10.0 10.1 10.2
5.5 5.6 5.7 8.0
Percona Server
MySQL
MariaDB
17/60
ちょっと思うこと
MariaDBは10.0の時に「MySQL 5.6のリリースは待ってい
られない。MariaDB 5.5をベースにMySQL 5.6の機能を バ
ックポート したMariaDB 10.0を開発する︕」と⾔って分岐
それ以来、MariaDB 10.1 も MariaDB 10.0 ベースで MySQL 5.7の
機能をバックポート/再インポートしてる
-
MySQL 5.6とそれ以降に開発された機能と(名前は同じだ
けど)実装が違う機能がいくつか(GTID, Multi Source
Replication, Data At Rest Encryption, ..)
18/60
ちょっと思うこと
MariaDB 10.2では binlog_format=MIXED がデフォルトにな
ったし(MySQL < 5.7はSTATEMENT, 5.7以降はROW)そ
ろそろDBAの目に⾒える範囲で互換性がなくなってきている
10.0くらいまではプラグインとかゴニョる⼈には⾒えたけどDBAには
⾒えない程度の非互換だった
-
MySQLプロトコルレベルでの互換性はあるのでまだそこの⼼配はいら
ないけど
-
19/60
⾯⽩いこと
Window FunctionはMariaDB 10.2で⼊れてきた(あるい
は、MariaDB Column Store(新⽣InfiniDB))ものに対抗し
て後から⾔い始めてる
CTEもMariaDB 10.2の⽅が先だった気がする-
Data At Rest Encryptionが実装された後にInnoDB暗号化
が追いかけて実装された
ログファイル、UNDOファイルの暗号化もMariaDBが先⾏-
MariaDBが先⾏実装する、MySQLが ムキになって それを追
いかける
⇒ 機能が増えて 俺が みんなが楽しい-
Multi Source Replicationもそうだったな-
20/60
閑話休題
21/60
切り⼝その1
NoSQL API
この場合のNoSQLは「mysqldがMySQLプロトコル(とその
上に乗っかるSQL)以外でしゃべる」という意味
実はOracle MySQLは5.6(4年以上前)からNoSQL APIに
開発リソースを割いている
22/60
MySQL de NoSQLの歴史
InnoDB API
Handler API
Executor
Optimizer
Parser
MySQL Protocol HS Protocol
HS Plugin
memcached Protocol
InnoDB Memcached
HTTP/MySQL X
23/60
HandlerSocket Plugin
MySQL 5.5〜5.6
MySQL 5.7はサポートされていない
SQLのパース、オプティマイザーをかっ⾶ばせばCPUコスト
削減できる
MySQLプロトコルでない軽量プロトコルにすることで転送
量を抑える
24/60
InnoDB Memcached Plugin
MySQL 5.6〜
基本的な⽅向性はHandlerSocketといっしょ
より⼀般的なmemcachedプロトコルを選んだところまでは
良かったものの
ちなみに、MySQL Clusterにもmemcached NDB engineと
いうmemcachedをしゃべるプラグイン(︖)がある
RDSでサポートされている唯⼀のMySQL de NoSQLインタ
ーフェース
25/60
MySQL HTTP Plugin
ラボ版MySQL 5.7のみ
たぶんもう開発されない
考え⽅としては「かっ⾶ばして⾼速化/軽量化」ではなく、
「HTTPをしゃべれる全てのライブラリーがデータベースの
クライアントになれる」ってことのような気がする
ちなみにMySQL Clusterにもmod̲ndbというHTTPをしゃ
べるプラグイン(︖)がある
26/60
MySQL HTTP Pugin(lab)
$ mysql -e "SELECT * FROM myhttp.simple"
+----+------------------+
| id | col_a |
+----+------------------+
| 1 | Hello |
| 2 | |
| 3 | world! |
| 4 | yoku0825 is here |
+----+------------------+
$ curl --user a:b "127.0.0.1:8080/sql/myhttp/SELECT+%2A+FROM+simple"
[
{
"meta":[
{"type":3,"catalog":"def","database":"myhttp","table":"simple","org_table":"simple","column":"id","org_col
umn":"id","charset":63,"length":11,"flags":16899,"decimals":0},
{"type":253,"catalog":"def","database":"myhttp","table":"simple","org_table":"simple","column":"col_a","or
g_column":"col_a","charset":33,"length":765,"flags":0,"decimals":0}
],
"data":[
["1","Hello"],
["2"," "],
["3","world!"],
["4","yoku0825 is here"]
],
"status":[{"server_status":34,"warning_count":0}]
}
]
27/60
SQLインジェクション
#とはなんだったのか
みたいなところが好き
28/60
MySQL de NoSQLの歴史
InnoDB API
Handler API
Executor
Optimizer
Parser
MySQL Protocol HS Protocol
HS Plugin
memcached Protocol
InnoDB Memcached
HTTP/MySQL X
29/60
MySQL X (X protocol)
MySQL 5.7.12〜 (GA #とは)
JSONデータ型、JSON関数群と若⼲の兼ね合いアリ
それらと合わせて「MySQL Document Store」という概念で売り込
みたいらしい
-
SQLパーサーをかっ⾶ばさない系
なのでgeneral̲logやスローログやbinlogに影響を及ぼさない-
サーバー側の「MySQL X」、クライアント側の「MySQL
Shell」または「X Dev API」で対になっている
30/60
MySQL Document Store
ドキュメントDBライクなデータ操作
JSONデータ型-
クライアントライブラリーにそれっぽいインターフェイスを追加(X
Dev API)
-
可変⻑なドキュメントの転送に相性の良さそうな新プロトコル(Xプ
ロトコル)
-
XプロトコルをしゃべれてX Dev APIを使えるクライアント
としてのMySQL Shell
31/60
X Protocol周り
MySQL Shell
Python JavaScript SQL
X Protocol MySQL Protocol
MySQL X (X Plugin) Native Protocol Parser
Connector/Python
32/60
MySQL de NoSQLの嬉しいこと
InnoDBのトランザクション性能をそのままにMySQLプロト
コル以外の⽅法でアクセスできる
memcachedプロトコルはアリだと思うけど、独⾃プロトコルの
MySQL Xはちょっとつらくない︖
それならむしろMySQL HTTP Pluginの⽅が筋は良いように思える
-
プロトコルを刷新することで非同期クライアントの実装もし
たいっぽい(X Dev API)
ちなみに “Cross(X)over between relational and document
model” で MySQL X らしい
-
33/60
非同期クライアント構想 in MySQL X(未実装)
http://mysqlserverteam.com/mysql-5-7-12-part-2-improving-
the-mysql-protocol/
34/60
ここまで
が1つ
35/60
切り⼝その2
SQL⽅⾯
⾼速化
新しい構⽂
運⽤関連
レプリケーション関連
36/60
SQLアクセスの⾼速化
5.6, 5.7, 8.0と続くオプティマイザーの強化
JOIN時の⾒積もり精度向上-
ORDER BY狙いのキー精度向上-
ヒストグラムのサポート(8.0)-
バッファプールに載っているかどうかでオプティマイザーコストを動
的に判定(未実装)
これは5.7の時から計画だけはあった
-
オプティマイザーの機能強化は透過的に(何も意識せずに)
性能を上げてくれる
37/60
新しい構⽂(1)
共通テーブル式(CTE)のサポート(WITH / WITH RECURSIVE
句)(8.0)
derivedテーブル(FROM句サブクエリー)の機能を使って実装され
ている
-
5.7で暗黙のテンポラリーテーブルのInnoDB化を頑張ったから実現し
た ︖
-
ロールとデフォルトロールの追加(8.0)
構⽂としては新しい SET ROLE, CREATE ROLE などなど-
ログインユーザーに権限をプラスする感じ-
38/60
新しい構⽂(2)
降順インデックス( KEY idx̲name ( column̲name
DESC ) )のサポート
SELECT .. NOWAIT , SELECT .. SKIP LOCKED 構⽂のサ
ポート
SELECT .. FOR UPDATE NOWAIT ⇒ ロック待ちせずに即アボート-
SELECT .. FOR UPDATE SKIP LOCKED ⇒ ロックを取れなかった⾏は取
らずに、取れた⾏だけロックと結果を返却
キューっぽいテーブルにいいんじゃない︖ ってドキュメントに書いてあった
-
Window Function ︕︖ (未実装)
https://www.slideshare.net/DagHWanvik/sql-window-
functions-for-mysql
-
39/60
運⽤関連(1)
performance̲schemaの⼤幅な機能強化(5.6)
5.5では(MySQLの)開発者専⽤みたいな機能だったのが-
フツーにDBAが使える程度の機能として充実-
メモリー関連の統計情報も(オーバーヘッドでかいけど)取れるよう
になった(5.7)
-
p̲sを更に⾒やすく集約する sys の追加(5.7)-
information̲schemaのInnoDB関連テーブルの強化(5.6)
SHOW ENGINE INNODB STATUS のステータスカウンターはほぼすべて
INNODB_METRICS で参照可能に(5.6)
-
INNODB_BUFFER_PAGE , INNODB_BUFFER_PAGE_LRU でバッファプールの
中⾝を覗けるように(5.6)
-
40/60
運⽤関連(2)
オプティマイザートレースの追加(5.6)
InnoDBログのリサイズが楽になった(5.6)
各種オンライン操作の範囲拡⼤(5.7)
SET PERSIST / RESET PERSIST 構⽂のサポート(8.0)
InnoDBデータディクショナリー( *.frm ファイルがなくな
る)(8.0)
InnoDBのAUTO̲INCREMENTがInnoDBログに記録される
ように(8.0)
ROLLBACKでAUTO̲INCREMENTが⻭抜けになる件のこと ではない-
41/60
レプリケーション関連(1)
5.6, 5.7と (特に準同期) レプリケーションのスループット
をとにかく上げようとしてきた
バイナリーログのグループコミット(5.6)
Bug#70669のFixでロック粒度がすごくでかい(5.6)
5.7でロックを分割し、スループットを向上させた
-
マルチスレッドスレーブ(5.6)
5.7ではバイナリーログのマスターでのグループコミット状況に合わせたパラレル化が
可能に(いわゆるスキーマ内マルチスレッドスレーブ)
-
42/60
レプリケーション関連(2)
master̲info, relay̲log̲info のInnoDB化
リレーログから取り出したイベントとrelay̲log̲infoを “1つのトラン
ザクションとしてコミット” し、 “コミットされていないリレーログ
はSQLスレッドが⽌まったら全部消す” ことでクラッシュセーフスレ
ーブを構成可能(5.6)
-
テーブル化することで複数の構造を容易に保存できるようになり、マ
ルチソースレプリケーションが実現(5.7)
-
GTID関連の使い勝⼿向上
オンラインでGTIDの有効化(5.7)-
SET GTID_PURGED ="+gtid_set" 構⽂のサポート(8.0)-
レプリケーション関連ステータスのperformance̲schema
へのポート(5.7)
5.7では SHOW SLAVE STATUS を完全に置き換えることはできなかった
ので8.0に期待
-
43/60
SQLの強化とは
つまり「できること」の強化
SQLの表現⼒が増えて今まで「MySQLにできなかったこと」が少しず
つ増えていく(といいな)
-
なんだかんだ⾔ってもMySQLへのアクセスは当然SQLが⼤
多数
ここがスピードアップことは全てのユーザーにメリットをもたらす-
RDBMSにとってのSQLはデータの問い合わせだけでなく
「管理機能のインターフェイス」でもある
シェルレス運⽤が捗りそうな SET PERSIST 構⽂はSUPER権限が必要
なのでRDSでは使えないかもなあ。。
-
44/60
ここまで
で2つ
45/60
切り⼝その3
InnoDB関連
機能, 性能の向上はもちろんだけど
MySQL 8.0.0時点での⼤きな⽅向性
46/60
InnoDB単体での強化(1)
Fast Index Creation(5.1 Plugin)
デフォルトストレージエンジン化(5.5)
バッファプールウォームアップ(5.6)
オンラインALTER TABLE(5.6)
FTS, GISのサポート(5.6)
「MyISAMにしかできないことをなくす」(5.6〜)-
47/60
InnoDB単体での強化(2)
バッファプールオンラインリサイズ(5.7)
ロックの分割によるスケーラビリティーの向上(5.7)
テーブルスペース暗号化(5.7)
REDOログ, UNDOログ暗号化(8.0)
48/60
Good-bye MyISAM?
5.1の時点から既に新機能の開発は⽌まっている
5.6のキーワード「MyISAMにできることはInnoDBにもでき
るようにする」「MyISAMでだけできることはなくす」
5.7では暗黙のテンポラリーテーブルまでInnoDB化
テンポラリーということは-
クラッシュしたら消えるということで-
ってことはREDOログ (暗黙のテンポラリーテーブルならUNDOログ
も) いらないじゃん︖ という最適化
-
そして8.0.0では本丸の mysql スキーマが全てInnoDBに
49/60
Hello, Dictator InnoDB
今まで プラガブルだったからできなかったこと を実現して
いく
データディクショナリーを .ibd ファイルのヘッダに載せる
ことで、InnoDBの耐久性をテーブル定義情報にも適⽤
MyISAMの都合を考えずに特化した結果に得られそうなもの
(予定) バッファプールに載ってるかどうかでオプティマイザーコスト
を打ち分けられるオプティマイザー
-
(予定) ネイティブパーティショニング (これ⾃体は実装済み) による
外部キー制約の撤廃
-
(噂) ページ内パーシャルアップデート(JSONデータ型だけ︖)-
50/60
The Others..
MySQLサーバー以外のプロダクト
MySQL InnoDB Cluster-
MySQL Docker-
R.I.P. MySQL Fabric-
51/60
MySQL InnoDB Cluster
MySQL Group Replication
ちょっと強い相互準同期レプリケーションを実現するプラグイン(5.7)-
ちょっと強い準同期 = 独⾃リレーログを送ってコンフリクトしないか
どうかの判定まで
-
コンフリクトしないことまでは即時保証だけど適⽤が終了するのは非
同期
-
グループレプリケーション内で相互に更新をやり取りするのでマルチ
マスター構成が可能
-
52/60
MySQL InnoDB Cluster
MySQL Router
グループレプリケーションのメンバー情報を問い合わせてキャッシュ-
キャッシュに沿って⽣きているサーバーにコネクションをルーティン
グ
コネクションのルーティングであってトランザクションの再開とかはできない
-
53/60
MySQL InnoDB Cluster
MySQL Shell
グループレプリケーションのオーケストレーターインターフェイス-
メンバーの追加, 削除, ステータス…だったりを管理-
コイツがいなくても別にクラスターの稼働に問題はない-
54/60
MySQL InnoDB Cluster
55/60
MySQL InnoDB Cluster
「ちょっと強い準同期」なので、書き込み性能は落ちる
シャーディング⽤途というよりは、お⼿軽簡単マルチマスタ
ー構成のニーズに対応するものらしい
InnoDBストレージエンジンなので、NDBCLUSTERほどピ
ーキーじゃない(はず)
類似製品にGalera Cluster for MySQL, MariaDB Galera
Cluster, Percona XtraDB Cluster
56/60
MySQL Docker
そもそもMySQL公式のyumやaptリポジトリーができたのが
割と最近のような気がするけれども
時代の流れに乗っかってDockerリポジトリーも作ってる
https://hub.docker.com/̲/mysql/ はDocker社オフィシャルの
MySQLリポジトリ
-
https://hub.docker.com/r/mysql/mysql-server/ がOracle
MySQLオフィシャルのリポジトリ
-
ややこしい-
調⼦に乗って⾊々作ってくれるのはいいこと
57/60
R.I.P. MySQL Fabric
MySQL Fabric support was removed.
MySQL :: MySQL Router Release Notes :: Changes in
MySQL Router 2.1.2 (2017-03-06, Release Candidate)
58/60
まとめ
3つの切り⼝
NoSQL API-
SQLの機能強化-
InnoDBの機能強化-
周辺製品の事情
MySQL InnoDB Cluster-
59/60
Questions
and/or
Suggestions?
60/60

MySQL 5.7の次のMySQL 8.0はどんなものになるだろう