Download - MySQL 5.7の次のMySQLは
MySQL 5.7の次のMySQLは歴史から 勘で 紐解く8.0
2016/12/10
yoku0825YAPC::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 FTSInnoDBバッファプールで収まってくれないお⾏儀悪いマン
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 GISInnoDBオンラインALTER TABLEInnoDB Memcached Pluginperformance̲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","org_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 SideMySQL X Pluginは5.6 -> 5.7のInnoDB Memcachedのように今度は性能を上げにくるか︖ 未実装の非同期処理にも期待
SQL Side“特に意識せずに速くなる” ものと、 “新しく導⼊されて意識しないと有効活⽤できない” もの両⽅が混在運⽤ SideSET 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.8MySQL 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