MySQL 5.7の次のMySQLは
歴史から 勘で 紐解く8.0 
2016/12/10
yoku0825
YAPC::Hokkaido 2016 Sapporo
おしながき
現時点で判明しているMySQL 8.0の新機能をユルくお知ら
せせずに
MySQL 5.7までの進化の⽅向性から
MySQL 8.0の進化の⽅向を 独断と偏⾒で雑に 考察します
1/54
というわ
けで
2/54
このスライドに記載された⾒
解は個⼈の意⾒であり、所属
する組織または所属しない組
織またはNULLの意⾒を ⼀切
代表するわけがありません
3/54
あと俺だいたいこういう
「MySQLの未来」的なや
つは外すんで、ネタとし
て眺めていてください
4/54
ちなみにどれくらい外すかというと
InfiniDB
本番導⼊した1週間後にInfiniDB社が倒産
MySQL Fabric
がんばってばんがってがんばってパッチして導⼊したけど、「嘘みたいだ
ろ、死んでるんだぜ、こいつ」
InnoDB FTS
InnoDBバッファプールで収まってくれないお⾏儀悪いマン
5/54
@kazuho さんの
セッションに⾏く
なら、今だ︕
6/54
\おはようございます/
yoku0825@とある企業のDBA
オラクれない-
ポスグれない-
マイエスキューエる-
⽣息域
Twitter: @yoku0825-
Blog: ⽇々の覚書-
MyNA ML: ⽇本MySQLユーザ会-
MySQL Casualʼs Slack: MySQL Casual-
7/54
Do you love
MySQL 5.7?
8/54
MySQLとそのフォーク
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
9/54
イマココ
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
10/54
ツギココ
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
11/54
MySQL 5.1
パーティション
⾏ベースレプリケーション
プラグインAPI
イベントスケジューラー
テーブル形式ロギング
12/54
MySQL 5.5
認証プラグイン
InnoDBのデフォルトストレージエンジン化
準同期レプリケーションプラグイン
utf8mb4の導⼊
ALTER TABLE .. TRUNCATE PARTITION の追加
13/54
MySQL 5.6
InnoDB FTS, InnoDB GIS
InnoDBオンラインALTER TABLE
InnoDB Memcached Plugin
performance̲schemaの強化
GTIDの導⼊
DATETIME型のマイクロ秒対応
マルチスレッドスレーブ
クラッシュセーフスレーブ
14/54
MySQL 5.7
アカウント管理ステートメントの強化
暗黙のテンポラリーテーブルのInnoDB化
⽇本語対応InnoDB FTS, InnoDB GISの空間インデックス
サポート
InnoDBバッファプールオンラインリサイズ
InnoDBテーブルスペース暗号化
JSON型
Generated Column
マルチソースレプリケーション
GTIDのオンライン有効化
MySQL X Protocol
15/54
MySQL 8.0
InnoDBデータディクショナリー
ロールのサポート
共通テーブル式(CTE)の実験的サポート
(噂) Group Replicationの標準バンドル
(噂) utf8mb4̲unicode̲900̲ci のデフォルト化
16/54
進化の⽅向
Release Series Common NoSQL side SQL side
5.5 utf8mb4 (HandlerSocket) -
5.6 クラッシュセーフス
レーブ, DATETIME
型, オンライン
ALTER TABLE
InnoDB
Memcached
InnoDB FTS,
InnoDB GIS, オプ
ティマイザーの強化
5.7(labs) - MySQL HTTP
Plugin
-
5.7 InnoDBの強化 InnoDB
Memcached +
MySQL X, JSON型
Generated
Column(?), オプテ
ィマイザーの強化
8.0 データディクショナ
リー, GR,
utf8mb4̲unicode
̲900̲ci
- 共通テーブル式, ロ
ール, ヒストグラム
17/54
進化の⽅向
Release Series Common NoSQL side SQL side
5.5 utf8mb4 (HandlerSocket) -
5.6 クラッシュセーフス
レーブ, DATETIME
型, オンライン
ALTER TABLE
InnoDB
Memcached
InnoDB FTS,
InnoDB GIS, オプ
ティマイザーの強化
5.7(labs) - MySQL HTTP
Plugin
-
5.7 InnoDBの強化 InnoDB
Memcached +
MySQL X, JSON型
Generated
Column(?), オプテ
ィマイザーの強化
8.0 データディクショナ
リー, GR,
utf8mb4̲unicode
̲900̲ci
- 共通テーブル式, ロ
ール, ヒストグラム
18/54
MySQL 5.6以降
MySQLは MySQLプロトコル以外の何か に⼀定の開発リソ
ースを割いている
InnoDB Memcached Plugin-
MySQL HTTP Plugin(labs)-
MySQL X Protocol(MySQL Shell)-
19/54
InnoDB Memcached Plugin
InnoDBのテーブルに対してmemcachedプロトコルでアク
セスできるようにする daemon plugin
2016/12/10現在 5.7以降では動かない HandlerSocketの対抗⾺︖-
今後 HandlerSocket が使いたかったらMariaDB…という世界線︖-
確かにSQLを1⾏ずつパースするよりは速い
フェールオーバー, 永続化, 複製という⾯で⾒れば、RDS for MySQL
とかではアリなのかも
-
20/54
MySQL HTTP Plugin(lab)
HTTPをパースしてSQLに変換してからSQLパーサーを通し
てる
なのでHandlerSocketやInnoDB Memcachedみたいな⾼速化を主眼
に据えたものではない
-
「だからAudit PluginやEnterprise Firewallと連携して動かせる」っ
て中の⼈が⾔ってて、確かに
-
21/54
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","or
g_column":"id","charset":63,"length":11,"flags":16899,"decimals":0},
{"type":253,"catalog":"def","database":"myhttp","table":"simple","org_table":"simple","column":"col_a
","org_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}]
}
]
22/54
SQLインジェク
ション #とは
なんだったのか
23/54
MySQL HTTP Pugin(lab)
MySQL Xに乗っ取られたので未来はない気がする
mod̲ndbも流⾏らなかったし-
⾯⽩いんだけどなあ…
俺が⾯⽩いと思ったものはやはり未来がないのか-
24/54
MySQL X Protocol(MySQL Shell)
レイヤー的にはMySQL Protocolを置き換える
TCPの上に X Protocol を載せてる-
上にSQLまたはX Dev APIが載る-
X Protocolをしゃべるコマンドラインクライアントが MySQL Shell-
「NoSQLちっくなライブラリーから使うなら、MySQLプロ
トコルは重すぎるよね」「だからProtocol Buffersベースの
新しいプロトコルを実装したよ」
本当にやりたいことはたぶん 非同期処理-
非同期処理は 未実装-
25/54
非同期処理(未実装)
http://mysqlserverteam.com/mysql-5-7-12-part-2-improving-
the-mysql-protocol/
26/54
JSON型 + Generated Column + X Protocol
“MySQL Docstore” って命名してた
InnoDBのトランザクション性能をそのままにNoSQLちっくなラ
イブラリーとの相性を良くしようと思ったんだろう
ちなみに “Cross(X)over between relational and document
model” で MySQL X らしい
SQL Parser
MySQL Protocol Parser
Storage Engine
MySQL X
libmysqlclient Ruby/MySQL
mysql Ruby
tmtms(?)
mysqlsh
27/54
進化の⽅向
Release Series Common NoSQL side SQL side
5.5 utf8mb4 (HandlerSocket) -
5.6 クラッシュセーフス
レーブ, DATETIME
型, オンライン
ALTER TABLE
InnoDB
Memcached
InnoDB FTS,
InnoDB GIS, オプ
ティマイザーの強化
5.7(labs) - MySQL HTTP
Plugin
-
5.7 InnoDBの強化 InnoDB
Memcached +
MySQL X, JSON型
Generated
Column(?), オプテ
ィマイザーの強化
8.0 データディクショナ
リー, GR,
utf8mb4̲unicode
̲900̲ci
- 共通テーブル式, ロ
ール, ヒストグラム
28/54
SQLアクセスの⾼速化
5.6, 5.7, 8.0と続くオプティマイザーの強化
JOIN時の⾒積もり精度向上-
ORDER BY狙いのキー精度向上-
ヒストグラムのサポート(8.0)-
オプティマイザーの機能強化は透過的に(何も意識せずに)
性能を上げてくれる
29/54
新しいSQL構⽂
共通テーブル式(CTE)、いわゆる WITH 句(8.0)
derivedテーブル(FROM句サブクエリー)の機能を使って実装され
ている
-
5.7で暗黙のテンポラリーテーブルのInnoDB化を頑張ったから実現し
た ︖
-
ロールとデフォルトロールの追加(8.0)
構⽂としては新しい SET ROLE, CREATE ROLE などなど-
30/54
運⽤⽀援(︖)
performance̲schemaの⼤幅な機能強化(5.6)
REDOログのリサイズが楽になった(5.6)
各種オンライン操作の範囲拡⼤(5.7)
SET PERSIST によってオンライン変更したパラメーターを固
定化(8.0)
31/54
進化の⽅向
Release Series Common NoSQL side SQL side
5.5 utf8mb4 (HandlerSocket) -
5.6 クラッシュセーフス
レーブ, DATETIME
型, オンライン
ALTER TABLE,
p̲s
InnoDB
Memcached
InnoDB FTS,
InnoDB GIS, オプ
ティマイザーの強化
5.7(labs) - MySQL HTTP
Plugin
-
5.7 InnoDBの強化 InnoDB
Memcached +
MySQL X, JSON型
Generated
Column, オプティ
マイザーの強化
8.0 データディクショナ
リー, GR,
utf8mb4̲unicode
̲900̲ci
- 共通テーブル式, ロ
ール, ヒストグラム
32/54
レプリケーションの⾼速化
5.6, 5.7と (特に準同期) レプリケーションのスループット
をとにかく上げようとしてきた
バイナリーログのグループコミット(5.6)
Bug#70669のFixでロック粒度がすごくでかい(5.6)
5.7でロックを分割し、スループットを向上させた
-
マルチスレッドスレーブ(5.6)
5.7ではバイナリーログのマスターでのグループコミット状況に合わせたパラレル化が
可能に(いわゆるスキーマ内マルチスレッドスレーブ)
-
33/54
レプリケーションの⾼機能化
master̲info, relay̲log̲info のInnoDB化(2015/12/10
現在、デフォルトはファイルのまま)
リレーログから取り出したイベントとrelay̲log̲infoを “1つのトラン
ザクションとしてコミット” し、 “コミットされていないリレーログ
はSQLスレッドが⽌まったら全部消す” ことでクラッシュセーフスレ
ーブを構成可能(5.6)
-
テーブル化することで複数の構造を容易に保存できるようになり、マ
ルチソースレプリケーションが実現(5.7)
-
34/54
InnoDBの迷⾛
MySQL 5.0リリース直後にInnobaseがOracleに買われて
MySQL 5.5時代にMySQL⾃⾝もOracleに買われたことで
最終的に同じ会社で開発されることになったMySQLと
InnoDB
35/54
InnoDB単体での強化
デフォルトストレージエンジン化(5.5)
バッファプールウォームアップ, REDOログのカジュアルな
サイズ変更(5.6)
p̲s, i̲sによるモニタリングの強化(5.6)
FTS, GISのサポート(5.6)
バッファプールオンラインリサイズ(5.7)
ロックの分割によるスケーラビリティーの向上(5.7)
素直なAdaptive Flushing(5.7)
36/54
Good-bye MyISAM?
5.1の時点から既に新機能の開発は⽌まっている
5.6のキーワード「MyISAMにできることはInnoDBにもでき
るようにする」「MyISAMでだけできることはなくす」
5.7では暗黙のテンポラリーテーブルまでInnoDB化
テンポラリーということは-
クラッシュしたら消えるということで-
ってことはREDOログ (暗黙のテンポラリーテーブルならUNDOログ
も) いらないじゃん︖ という最適化
-
そして8.0.0では本丸の mysql スキーマが全てInnoDBに
37/54
Hello, Dictator InnoDB
今まで プラガブルだったからできなかったこと を実現して
いく
データディクショナリーを .ibd ファイルのヘッダに載せる
ことで、InnoDBの耐久性をテーブル定義情報にも適⽤
MyISAMの都合を考えずに特化した結果に得られそうなもの
(予定) バッファプールに載ってるかどうかでオプティマイザーコスト
を打ち分けられるオプティマイザー
-
(予定) ネイティブパーティショニング (これ⾃体は実装済み) による
外部キー制約の撤廃
-
(噂) ページ内パーシャルアップデート(JSONデータ型だけ︖)-
38/54
Group Replication and InnoDB Cluster
データ同期型のマルチマスターソリューションがGroup
Replication(5.7 labs Plugin)
どうやら標準バンドル(INSTALL PLUGIN だけ⾃分でやる)にしたいら
しい
-
Group Replication + MySQL Router + MySQL Shell(As
orchestrator) でオール(︖)インワン(︖)パッケージを
提供するのがInnoDB Cluster
39/54
InnoDB Cluster
40/54
まとめ
41/54
yoku0825的8.0観察ポイント
NoSQL Side
MySQL X Pluginは5.6 -> 5.7のInnoDB Memcachedのように今度は性能
を上げにくるか︖ 未実装の非同期処理にも期待
SQL Side
“特に意識せずに速くなる” ものと、 “新しく導⼊されて意識しないと有効活
⽤できない” もの両⽅が混在
運⽤ Side
SET PERSIST とか今までそれなりに要望があったであろうものが追加、パラ
メーターのオンライン変更範囲拡⼤にも期待、p̲sの更なる機能追加(特に
5.7で中途半端に終わったレプリケーション関連)
レプリケーション Side
今までのレプリケーションはそろそろひと段落して、Group Replication
(≒InnoDB Cluster) をどこまで使い物にできるか
42/54
というわけで
現時点で判明しているMySQL 8.0の新機能をユルくお知ら
せせずに
MySQL 5.7までの進化の⽅向性から
MySQL 8.0の進化の⽅向を 独断と偏⾒で雑に 考察しました
43/54
このスライドに記載された⾒
解は個⼈の意⾒であり、所属
する組織または所属しない組
織またはNULLの意⾒を ⼀切
合切 代表するわけがありませ
ん ;)
44/54
( ゚д゚)
45/54
(゚д゚)
46/54
(゚д゚ )
47/54
One more
thing,
48/54
罠
49/54
default_password_lifetime <> 0
5.7.11で暗黙のデフォルトが0に変更されたが
“次のメジャーバージョンでまた0以外にする” って⾔ってる
から、8.0では来るのではないかと
An update on default̲password̲lifetime-
MySQL Bugs: #79939: default̲password̲lifetime > 0 should
print warning at startup
-
MySQL Bugs: #79959: SYS should have a view of user
accounts expiring
-
50/54
「kamipoのハハ=パパ問題」
SELECT * FROM families;
+----+-----------+--------------+
| id | name | relationship |
+----+-----------+--------------+
| 1 | ユイ | 本人 |
| 2 | キリト | パパ |
| 3 | アスナ | ハハ |
+----+-----------+--------------+
SELECT * FROM families WHERE relationship = 'パパ';
+----+-----------+--------------+
| id | name | relationship |
+----+-----------+--------------+
| 2 | キリト | パパ |
| 3 | アスナ | ハハ |
+----+-----------+--------------+
(c) kamipo
51/54
「kamipoのハハ=パパ問題」
In addition to utf8mb4, we are also considering
switching the default collation to be
utf8mb4̲unicode̲520̲ci.
Planning the defaults for MySQL 5.8
MySQL Bugs: #79977: utf8mb4̲unicode̲520̲ci donʼt
make sense for Japanese FTS
52/54
MySQL先⽣の次
回作にご期待くだ
さい
Stay tuned!!
53/54
Questions
and/or
Suggestions?
54/54

MySQL 5.7の次のMySQLは