Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

9,437 views

Published on

2017/03/10 OSC 2017 Tokyo/Spring

Published in: Technology
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

  1. 1. MySQL 5.7の次のMySQL 8.0はど んなものになるだろう MySQL先⽣の次回作はおそらく4⽉中旬 2017/03/10 yoku0825 OSC 2017 Tokyo/Spring
  2. 2. \こんにちは/ yoku0825@とある企業のDBA オラクれない- ポスグれない- マイエスキューエる- ⽣息域 Twitter: @yoku0825- Blog: ⽇々の覚書- MyNA ML: ⽇本MySQLユーザ会- MySQL Casualʼs Slack: MySQL Casual- 1/60
  3. 3. このスライドのゴール MySQL 8.0に興味のある⼈を増やす 今からMySQL 8.0にワクワクしてもらう 2/60
  4. 4. このスライドに記載された⾒ 解は個⼈の意⾒であり、所属 する組織または所属しない組 織またはNULLの意⾒を ⼀切 代表するわけがありません 3/60
  5. 5. MySQL 8.0に⾄るまでのみちのり < MySQL 5.1 MySQL 5.1 MySQL 5.5 MySQL 5.6 MySQL 5.7 MySQL 8.0 4/60
  6. 6. < MySQL 5.1 もうやめて俺のライフはゼロよ 5/60
  7. 7. MySQL 5.1 パーティション ⾏ベースレプリケーション( binlog_format ) ストレージエンジンプラグインAPI イベントスケジューラー テーブル形式ロギング 6/60
  8. 8. MySQL 5.5 認証プラグイン InnoDBのデフォルトストレージエンジン化 準同期レプリケーションプラグイン utf8mb4の導⼊ 7/60
  9. 9. MySQL 5.6 InnoDB FTS, InnoDB GIS InnoDBオンラインALTER TABLE InnoDB Memcached Plugin performance̲schemaの強化 GTIDの導⼊ DATETIME型のマイクロ秒対応 マルチスレッドスレーブ クラッシュセーフスレーブ 8/60
  10. 10. MySQL 5.7(1) アカウント管理の強化 暗黙のテンポラリーテーブルのInnoDB化 ⽇本語対応InnoDB FTS, InnoDB GISの空間インデックス サポート InnoDBバッファプールオンラインリサイズ InnoDBテーブルスペース暗号化 JSONデータ型, JSON関数 9/60
  11. 11. MySQL 5.7(2) Generated Column(式インデックス的な) マルチソースレプリケーション GTIDのオンライン有効化 MySQL X Protocol Group Replication オプティマイザーヒント構⽂のサポート 10/60
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. 参考 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
  16. 16. 増えるわ 増える 15/60
  17. 17. イマココ 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
  18. 18. ツギココ 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
  19. 19. ちょっと思うこと 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
  20. 20. ちょっと思うこと MariaDB 10.2では binlog_format=MIXED がデフォルトにな ったし(MySQL < 5.7はSTATEMENT, 5.7以降はROW)そ ろそろDBAの目に⾒える範囲で互換性がなくなってきている 10.0くらいまではプラグインとかゴニョる⼈には⾒えたけどDBAには ⾒えない程度の非互換だった - MySQLプロトコルレベルでの互換性はあるのでまだそこの⼼配はいら ないけど - 19/60
  21. 21. ⾯⽩いこと 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
  22. 22. 閑話休題 21/60
  23. 23. 切り⼝その1 NoSQL API この場合のNoSQLは「mysqldがMySQLプロトコル(とその 上に乗っかるSQL)以外でしゃべる」という意味 実はOracle MySQLは5.6(4年以上前)からNoSQL APIに 開発リソースを割いている 22/60
  24. 24. 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
  25. 25. HandlerSocket Plugin MySQL 5.5〜5.6 MySQL 5.7はサポートされていない SQLのパース、オプティマイザーをかっ⾶ばせばCPUコスト 削減できる MySQLプロトコルでない軽量プロトコルにすることで転送 量を抑える 24/60
  26. 26. InnoDB Memcached Plugin MySQL 5.6〜 基本的な⽅向性はHandlerSocketといっしょ より⼀般的なmemcachedプロトコルを選んだところまでは 良かったものの ちなみに、MySQL Clusterにもmemcached NDB engineと いうmemcachedをしゃべるプラグイン(︖)がある RDSでサポートされている唯⼀のMySQL de NoSQLインタ ーフェース 25/60
  27. 27. MySQL HTTP Plugin ラボ版MySQL 5.7のみ たぶんもう開発されない 考え⽅としては「かっ⾶ばして⾼速化/軽量化」ではなく、 「HTTPをしゃべれる全てのライブラリーがデータベースの クライアントになれる」ってことのような気がする ちなみにMySQL Clusterにもmod̲ndbというHTTPをしゃ べるプラグイン(︖)がある 26/60
  28. 28. 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
  29. 29. SQLインジェクション #とはなんだったのか みたいなところが好き 28/60
  30. 30. 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
  31. 31. 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
  32. 32. MySQL Document Store ドキュメントDBライクなデータ操作 JSONデータ型- クライアントライブラリーにそれっぽいインターフェイスを追加(X Dev API) - 可変⻑なドキュメントの転送に相性の良さそうな新プロトコル(Xプ ロトコル) - XプロトコルをしゃべれてX Dev APIを使えるクライアント としてのMySQL Shell 31/60
  33. 33. X Protocol周り MySQL Shell Python JavaScript SQL X Protocol MySQL Protocol MySQL X (X Plugin) Native Protocol Parser Connector/Python 32/60
  34. 34. 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
  35. 35. 非同期クライアント構想 in MySQL X(未実装) http://mysqlserverteam.com/mysql-5-7-12-part-2-improving- the-mysql-protocol/ 34/60
  36. 36. ここまで が1つ 35/60
  37. 37. 切り⼝その2 SQL⽅⾯ ⾼速化 新しい構⽂ 運⽤関連 レプリケーション関連 36/60
  38. 38. SQLアクセスの⾼速化 5.6, 5.7, 8.0と続くオプティマイザーの強化 JOIN時の⾒積もり精度向上- ORDER BY狙いのキー精度向上- ヒストグラムのサポート(8.0)- バッファプールに載っているかどうかでオプティマイザーコストを動 的に判定(未実装) これは5.7の時から計画だけはあった - オプティマイザーの機能強化は透過的に(何も意識せずに) 性能を上げてくれる 37/60
  39. 39. 新しい構⽂(1) 共通テーブル式(CTE)のサポート(WITH / WITH RECURSIVE 句)(8.0) derivedテーブル(FROM句サブクエリー)の機能を使って実装され ている - 5.7で暗黙のテンポラリーテーブルのInnoDB化を頑張ったから実現し た ︖ - ロールとデフォルトロールの追加(8.0) 構⽂としては新しい SET ROLE, CREATE ROLE などなど- ログインユーザーに権限をプラスする感じ- 38/60
  40. 40. 新しい構⽂(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
  41. 41. 運⽤関連(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
  42. 42. 運⽤関連(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
  43. 43. レプリケーション関連(1) 5.6, 5.7と (特に準同期) レプリケーションのスループット をとにかく上げようとしてきた バイナリーログのグループコミット(5.6) Bug#70669のFixでロック粒度がすごくでかい(5.6) 5.7でロックを分割し、スループットを向上させた - マルチスレッドスレーブ(5.6) 5.7ではバイナリーログのマスターでのグループコミット状況に合わせたパラレル化が 可能に(いわゆるスキーマ内マルチスレッドスレーブ) - 42/60
  44. 44. レプリケーション関連(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
  45. 45. SQLの強化とは つまり「できること」の強化 SQLの表現⼒が増えて今まで「MySQLにできなかったこと」が少しず つ増えていく(といいな) - なんだかんだ⾔ってもMySQLへのアクセスは当然SQLが⼤ 多数 ここがスピードアップことは全てのユーザーにメリットをもたらす- RDBMSにとってのSQLはデータの問い合わせだけでなく 「管理機能のインターフェイス」でもある シェルレス運⽤が捗りそうな SET PERSIST 構⽂はSUPER権限が必要 なのでRDSでは使えないかもなあ。。 - 44/60
  46. 46. ここまで で2つ 45/60
  47. 47. 切り⼝その3 InnoDB関連 機能, 性能の向上はもちろんだけど MySQL 8.0.0時点での⼤きな⽅向性 46/60
  48. 48. 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
  49. 49. InnoDB単体での強化(2) バッファプールオンラインリサイズ(5.7) ロックの分割によるスケーラビリティーの向上(5.7) テーブルスペース暗号化(5.7) REDOログ, UNDOログ暗号化(8.0) 48/60
  50. 50. Good-bye MyISAM? 5.1の時点から既に新機能の開発は⽌まっている 5.6のキーワード「MyISAMにできることはInnoDBにもでき るようにする」「MyISAMでだけできることはなくす」 5.7では暗黙のテンポラリーテーブルまでInnoDB化 テンポラリーということは- クラッシュしたら消えるということで- ってことはREDOログ (暗黙のテンポラリーテーブルならUNDOログ も) いらないじゃん︖ という最適化 - そして8.0.0では本丸の mysql スキーマが全てInnoDBに 49/60
  51. 51. Hello, Dictator InnoDB 今まで プラガブルだったからできなかったこと を実現して いく データディクショナリーを .ibd ファイルのヘッダに載せる ことで、InnoDBの耐久性をテーブル定義情報にも適⽤ MyISAMの都合を考えずに特化した結果に得られそうなもの (予定) バッファプールに載ってるかどうかでオプティマイザーコスト を打ち分けられるオプティマイザー - (予定) ネイティブパーティショニング (これ⾃体は実装済み) による 外部キー制約の撤廃 - (噂) ページ内パーシャルアップデート(JSONデータ型だけ︖)- 50/60
  52. 52. The Others.. MySQLサーバー以外のプロダクト MySQL InnoDB Cluster- MySQL Docker- R.I.P. MySQL Fabric- 51/60
  53. 53. MySQL InnoDB Cluster MySQL Group Replication ちょっと強い相互準同期レプリケーションを実現するプラグイン(5.7)- ちょっと強い準同期 = 独⾃リレーログを送ってコンフリクトしないか どうかの判定まで - コンフリクトしないことまでは即時保証だけど適⽤が終了するのは非 同期 - グループレプリケーション内で相互に更新をやり取りするのでマルチ マスター構成が可能 - 52/60
  54. 54. MySQL InnoDB Cluster MySQL Router グループレプリケーションのメンバー情報を問い合わせてキャッシュ- キャッシュに沿って⽣きているサーバーにコネクションをルーティン グ コネクションのルーティングであってトランザクションの再開とかはできない - 53/60
  55. 55. MySQL InnoDB Cluster MySQL Shell グループレプリケーションのオーケストレーターインターフェイス- メンバーの追加, 削除, ステータス…だったりを管理- コイツがいなくても別にクラスターの稼働に問題はない- 54/60
  56. 56. MySQL InnoDB Cluster 55/60
  57. 57. MySQL InnoDB Cluster 「ちょっと強い準同期」なので、書き込み性能は落ちる シャーディング⽤途というよりは、お⼿軽簡単マルチマスタ ー構成のニーズに対応するものらしい InnoDBストレージエンジンなので、NDBCLUSTERほどピ ーキーじゃない(はず) 類似製品にGalera Cluster for MySQL, MariaDB Galera Cluster, Percona XtraDB Cluster 56/60
  58. 58. 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
  59. 59. 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
  60. 60. まとめ 3つの切り⼝ NoSQL API- SQLの機能強化- InnoDBの機能強化- 周辺製品の事情 MySQL InnoDB Cluster- 59/60
  61. 61. Questions and/or Suggestions? 60/60

×