Top Banner
MySQL 5.7の次のMySQL歴史から 勘で 紐解く8.0 2016/12/10 yoku0825 YAPC::Hokkaido 2016 Sapporo
55

MySQL 5.7の次のMySQLは

Apr 16, 2017

Download

Technology

yoku0825
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: MySQL 5.7の次のMySQLは

MySQL 5.7の次のMySQLは歴史から 勘で 紐解く8.0 

2016/12/10

yoku0825YAPC::Hokkaido 2016 Sapporo

Page 2: MySQL 5.7の次のMySQLは

おしながき

現時点で判明しているMySQL 8.0の新機能をユルくお知らせせずにMySQL 5.7までの進化の⽅向性からMySQL 8.0の進化の⽅向を 独断と偏⾒で雑に 考察します

1/54

Page 3: MySQL 5.7の次のMySQLは

というわけで

2/54

Page 4: MySQL 5.7の次のMySQLは

このスライドに記載された⾒解は個⼈の意⾒であり、所属する組織または所属しない組織またはNULLの意⾒を ⼀切 代表するわけがありません

3/54

Page 5: MySQL 5.7の次のMySQLは

あと俺だいたいこういう「MySQLの未来」的なやつは外すんで、ネタとして眺めていてください

4/54

Page 6: MySQL 5.7の次のMySQLは

ちなみにどれくらい外すかというと

InfiniDB本番導⼊した1週間後にInfiniDB社が倒産

MySQL Fabricがんばってばんがってがんばってパッチして導⼊したけど、「嘘みたいだろ、死んでるんだぜ、こいつ」

InnoDB FTSInnoDBバッファプールで収まってくれないお⾏儀悪いマン

5/54

Page 7: MySQL 5.7の次のMySQLは

@kazuho さんのセッションに⾏くなら、今だ︕

6/54

Page 8: MySQL 5.7の次のMySQLは

\おはようございます/

yoku0825@とある企業のDBAオラクれない-ポスグれない-マイエスキューエる-

⽣息域Twitter: @yoku0825-Blog: ⽇々の覚書-MyNA ML: ⽇本MySQLユーザ会-MySQL Casualʼs Slack: MySQL Casual-

7/54

Page 9: MySQL 5.7の次のMySQLは

Do you love MySQL 5.7?

8/54

Page 10: MySQL 5.7の次のMySQLは

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

Page 11: MySQL 5.7の次の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

10/54

Page 12: MySQL 5.7の次の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

11/54

Page 13: MySQL 5.7の次のMySQLは

MySQL 5.1

パーティション⾏ベースレプリケーションプラグインAPIイベントスケジューラーテーブル形式ロギング

12/54

Page 14: MySQL 5.7の次のMySQLは

MySQL 5.5

認証プラグインInnoDBのデフォルトストレージエンジン化準同期レプリケーションプラグインutf8mb4の導⼊ALTER TABLE .. TRUNCATE PARTITION の追加

13/54

Page 15: MySQL 5.7の次のMySQLは

MySQL 5.6

InnoDB FTS, InnoDB GISInnoDBオンラインALTER TABLEInnoDB Memcached Pluginperformance̲schemaの強化GTIDの導⼊DATETIME型のマイクロ秒対応マルチスレッドスレーブクラッシュセーフスレーブ

14/54

Page 16: MySQL 5.7の次のMySQLは

MySQL 5.7

アカウント管理ステートメントの強化暗黙のテンポラリーテーブルのInnoDB化⽇本語対応InnoDB FTS, InnoDB GISの空間インデックスサポートInnoDBバッファプールオンラインリサイズInnoDBテーブルスペース暗号化JSON型Generated ColumnマルチソースレプリケーションGTIDのオンライン有効化MySQL X Protocol

15/54

Page 17: MySQL 5.7の次のMySQLは

MySQL 8.0

InnoDBデータディクショナリーロールのサポート共通テーブル式(CTE)の実験的サポート(噂) Group Replicationの標準バンドル(噂) utf8mb4̲unicode̲900̲ci のデフォルト化

16/54

Page 18: MySQL 5.7の次のMySQLは

進化の⽅向

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

Page 19: MySQL 5.7の次のMySQLは

進化の⽅向

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

Page 20: MySQL 5.7の次のMySQLは

MySQL 5.6以降

MySQLは MySQLプロトコル以外の何か に⼀定の開発リソースを割いている

InnoDB Memcached Plugin-MySQL HTTP Plugin(labs)-MySQL X Protocol(MySQL Shell)-

19/54

Page 21: MySQL 5.7の次のMySQLは

InnoDB Memcached Plugin

InnoDBのテーブルに対してmemcachedプロトコルでアクセスできるようにする daemon plugin

2016/12/10現在 5.7以降では動かない HandlerSocketの対抗⾺︖-今後 HandlerSocket が使いたかったらMariaDB…という世界線︖-

確かにSQLを1⾏ずつパースするよりは速いフェールオーバー, 永続化, 複製という⾯で⾒れば、RDS for MySQLとかではアリなのかも

-

20/54

Page 22: MySQL 5.7の次のMySQLは

MySQL HTTP Plugin(lab)

HTTPをパースしてSQLに変換してからSQLパーサーを通してるなのでHandlerSocketやInnoDB Memcachedみたいな⾼速化を主眼に据えたものではない

-

「だからAudit PluginやEnterprise Firewallと連携して動かせる」って中の⼈が⾔ってて、確かに

-

21/54

Page 23: MySQL 5.7の次のMySQLは

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

Page 24: MySQL 5.7の次のMySQLは

SQLインジェクション #とはなんだったのか

23/54

Page 25: MySQL 5.7の次のMySQLは

MySQL HTTP Pugin(lab)

MySQL Xに乗っ取られたので未来はない気がするmod̲ndbも流⾏らなかったし-

⾯⽩いんだけどなあ…俺が⾯⽩いと思ったものはやはり未来がないのか-

24/54

Page 26: MySQL 5.7の次のMySQLは

MySQL X Protocol(MySQL Shell)

レイヤー的にはMySQL Protocolを置き換えるTCPの上に X Protocol を載せてる-上にSQLまたはX Dev APIが載る-X Protocolをしゃべるコマンドラインクライアントが MySQL Shell-

「NoSQLちっくなライブラリーから使うなら、MySQLプロトコルは重すぎるよね」「だからProtocol Buffersベースの新しいプロトコルを実装したよ」本当にやりたいことはたぶん 非同期処理-非同期処理は 未実装-

25/54

Page 27: MySQL 5.7の次のMySQLは

非同期処理(未実装)

http://mysqlserverteam.com/mysql-5-7-12-part-2-improving-the-mysql-protocol/

26/54

Page 28: MySQL 5.7の次のMySQLは

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

Page 29: MySQL 5.7の次のMySQLは

進化の⽅向

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

Page 30: MySQL 5.7の次のMySQLは

SQLアクセスの⾼速化

5.6, 5.7, 8.0と続くオプティマイザーの強化JOIN時の⾒積もり精度向上-ORDER BY狙いのキー精度向上-ヒストグラムのサポート(8.0)-

オプティマイザーの機能強化は透過的に(何も意識せずに)性能を上げてくれる

29/54

Page 31: MySQL 5.7の次のMySQLは

新しいSQL構⽂

共通テーブル式(CTE)、いわゆる WITH 句(8.0)derivedテーブル(FROM句サブクエリー)の機能を使って実装されている

-

5.7で暗黙のテンポラリーテーブルのInnoDB化を頑張ったから実現した ︖

-

ロールとデフォルトロールの追加(8.0)構⽂としては新しい SET ROLE, CREATE ROLE などなど-

30/54

Page 32: MySQL 5.7の次のMySQLは

運⽤⽀援(︖)

performance̲schemaの⼤幅な機能強化(5.6)REDOログのリサイズが楽になった(5.6)各種オンライン操作の範囲拡⼤(5.7)SET PERSIST によってオンライン変更したパラメーターを固定化(8.0)

31/54

Page 33: MySQL 5.7の次のMySQLは

進化の⽅向

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

Page 34: MySQL 5.7の次のMySQLは

レプリケーションの⾼速化

5.6, 5.7と (特に準同期) レプリケーションのスループットをとにかく上げようとしてきたバイナリーログのグループコミット(5.6)

Bug#70669のFixでロック粒度がすごくでかい(5.6)5.7でロックを分割し、スループットを向上させた

-

マルチスレッドスレーブ(5.6)5.7ではバイナリーログのマスターでのグループコミット状況に合わせたパラレル化が可能に(いわゆるスキーマ内マルチスレッドスレーブ)

-

33/54

Page 35: MySQL 5.7の次のMySQLは

レプリケーションの⾼機能化

master̲info, relay̲log̲info のInnoDB化(2015/12/10現在、デフォルトはファイルのまま)リレーログから取り出したイベントとrelay̲log̲infoを “1つのトランザクションとしてコミット” し、 “コミットされていないリレーログはSQLスレッドが⽌まったら全部消す” ことでクラッシュセーフスレーブを構成可能(5.6)

-

テーブル化することで複数の構造を容易に保存できるようになり、マルチソースレプリケーションが実現(5.7)

-

34/54

Page 36: MySQL 5.7の次のMySQLは

InnoDBの迷⾛

MySQL 5.0リリース直後にInnobaseがOracleに買われてMySQL 5.5時代にMySQL⾃⾝もOracleに買われたことで最終的に同じ会社で開発されることになったMySQLとInnoDB

35/54

Page 37: MySQL 5.7の次のMySQLは

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

Page 38: MySQL 5.7の次のMySQLは

Good-bye MyISAM?

5.1の時点から既に新機能の開発は⽌まっている5.6のキーワード「MyISAMにできることはInnoDBにもできるようにする」「MyISAMでだけできることはなくす」5.7では暗黙のテンポラリーテーブルまでInnoDB化テンポラリーということは-クラッシュしたら消えるということで-ってことはREDOログ (暗黙のテンポラリーテーブルならUNDOログも) いらないじゃん︖ という最適化

-

そして8.0.0では本丸の mysql スキーマが全てInnoDBに

37/54

Page 39: MySQL 5.7の次のMySQLは

Hello, Dictator InnoDB

今まで プラガブルだったからできなかったこと を実現していくデータディクショナリーを .ibd ファイルのヘッダに載せることで、InnoDBの耐久性をテーブル定義情報にも適⽤MyISAMの都合を考えずに特化した結果に得られそうなもの

(予定) バッファプールに載ってるかどうかでオプティマイザーコストを打ち分けられるオプティマイザー

-

(予定) ネイティブパーティショニング (これ⾃体は実装済み) による外部キー制約の撤廃

-

(噂) ページ内パーシャルアップデート(JSONデータ型だけ︖)-

38/54

Page 40: MySQL 5.7の次のMySQLは

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

Page 41: MySQL 5.7の次のMySQLは

InnoDB Cluster

40/54

Page 42: MySQL 5.7の次のMySQLは

まとめ41/54

Page 43: MySQL 5.7の次のMySQLは

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

Page 44: MySQL 5.7の次のMySQLは

というわけで

現時点で判明しているMySQL 8.0の新機能をユルくお知らせせずにMySQL 5.7までの進化の⽅向性からMySQL 8.0の進化の⽅向を 独断と偏⾒で雑に 考察しました

43/54

Page 45: MySQL 5.7の次のMySQLは

このスライドに記載された⾒解は個⼈の意⾒であり、所属する組織または所属しない組織またはNULLの意⾒を ⼀切合切 代表するわけがありませ

ん ;)44/54

Page 46: MySQL 5.7の次のMySQLは

( ゚д゚)45/54

Page 47: MySQL 5.7の次のMySQLは

(゚д゚)46/54

Page 48: MySQL 5.7の次のMySQLは

(゚д゚ )47/54

Page 49: MySQL 5.7の次のMySQLは

One more thing,

48/54

Page 50: MySQL 5.7の次のMySQLは

罠49/54

Page 51: MySQL 5.7の次のMySQLは

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

Page 52: MySQL 5.7の次のMySQLは

「kamipoのハハ=パパ問題」

SELECT * FROM families;+----+-----------+--------------+| id | name | relationship |+----+-----------+--------------+| 1 | ユイ | 本人 || 2 | キリト | パパ || 3 | アスナ | ハハ |+----+-----------+--------------+

SELECT * FROM families WHERE relationship = 'パパ';+----+-----------+--------------+| id | name | relationship |+----+-----------+--------------+| 2 | キリト | パパ || 3 | アスナ | ハハ |+----+-----------+--------------+

(c) kamipo

51/54

Page 53: MySQL 5.7の次のMySQLは

「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

Page 54: MySQL 5.7の次のMySQLは

MySQL先⽣の次回作にご期待くだ

さいStay tuned!!

53/54

Page 55: MySQL 5.7の次のMySQLは

Questions and/or

Suggestions?54/54