Slide 1

Slide 1 text

20年前のMySQL、今のMySQL ノストラダムスの予言を超えて 2019/12/01 yoku0825 PHP Conference Japan 2019

Slide 2

Slide 2 text

20回目のPHPカン ファレンス おめで とうございます!! 1/65

Slide 3

Slide 3 text

TL;DR 2/65

Slide 4

Slide 4 text

2019年のMySQLが大事にしている(ように見える)もの レプリケーション SQLそのものの強化 SQLだけでできること、の拡充 3/65

Slide 5

Slide 5 text

免責事項 このスライドはyoku0825個人の見解に基づいて作成されており、所属する組織お よび所属しない組織あるいはNULLの一切の意見を代表するわけがありません ついでにPHPネタも出てきません 4/65

Slide 6

Slide 6 text

\こんにちは/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter: @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ 5/65

Slide 7

Slide 7 text

overview 1995年 MySQL誕生(ただしこの時点では一般公開されていなかった) 1997年 3.21.x 最初の日本語対応 2000年(3月) 日本MySQLユーザ会発足 2000年(6月) MySQL 3.23.19 からGPLv2での頒布が始まる 第1回目の日本でのPHPカンファレンスらしい 2001年 MySQL 3.23.31製品リリース 2003年 MySQL 4.0製品リリース 2003年 libmysqlclient.so がLGPLからGPLv2に変更 2004年 MySQL 4.1製品リリース 2004年 GPLv2にFOSS例外規定を追加 6/65

Slide 8

Slide 8 text

overview 2005年 MySQL 5.0製品リリース 2005年 InnobaseがOracleに買収される 2008年 MySQL ABがSun Microsystemsに買収される 2008年 Mariaストレージエンジンの開発がスタート 2008年 MySQL 5.1製品リリース 2009年 MariaDBのフォーク 2009年 MySQL 6.0の息の根が止まる 2010年 Sun MicrosystemsがOracleに買収される 2010年 MySQL 5.5製品リリース 7/65

Slide 9

Slide 9 text

overview 2013年 MySQL 5.6製品リリース 2015年 MySQL 5.7製品リリース 2015年 MySQL Fabric製品リリース 2017年 InnoDB Cluster製品リリース 2018年 MySQL 8.0製品リリース 8/65

Slide 10

Slide 10 text

MySQLが割と昔から大 事にしていて、最近大 事にしなくなったもの 9/65

Slide 11

Slide 11 text

組み込み用 mysqld 10/65

Slide 12

Slide 12 text

組み込み用mysqld 2003年 MySQL 4.0から 2018年 MySQL 8.0サポート終了 MySQL :: MySQL Classic Edition 11/65

Slide 13

Slide 13 text

組み込み用mysqld 主にCのアプリケーションに「直接MySQLの機能を埋め込む」ためのライブラリ群 「直接埋め込む」ため、GPL版のコピーレフトの影響が回避できない プロセスなしでSQLでアクセスできてクラッシュアンセーフ… SQLite3に取って代わられたんじゃないかしら(推測) ‐ 12/65

Slide 14

Slide 14 text

組み込み用mysqld 以前のMySQLがバイナリのサイズを小さく保とうとしていた理由の一つはこれだ と思う 今後、小さなフットプリントで…というのは期待できなくなるかも知れない ‐ “Linux - Generic” で “Minimal Install”版というパッケージを提供し始めたので多少はがんば るのかも ‐ rpm全部入りtarボール( *.rpm-bundle.tar )のサイズがこんな 5.7.28のうち200MB弱がembedded ‐ Version size 8.0.18 653.1M 8.0.18-minimal 178.1M 5.7.28 581.3M 5.6.46 297.9M 5.5.62 165.3M 13/65

Slide 15

Slide 15 text

MySQLがここ5年 以上やっていること 14/65

Slide 16

Slide 16 text

MyISAM撲 滅 15/65

Slide 17

Slide 17 text

MyISAM撲滅 2010年 MySQL 5.5 デフォルトストレージエンジンがInnoDBに変更 ‐ 2012年 MySQL 5.6 「MyISAMにできてInnoDBにできないことをなくす」 ‐ InnoDB FTSのサポート ‐ 2014年 MySQL 5.7 mysql スキーマの一部がInnoDBに ‐ InnoDB GISのサポート ‐ SELECT時に暗黙で作られるテンポラリーテーブルがInnoDBに ‐ 2018年 MySQL 8.0 mysql スキーマが完全にInnoDBに ‐ 暗黙のテンポラリーテーブルにもうMyISAMは選べない ‐ 16/65

Slide 18

Slide 18 text

Good-bye マイア勇 17/65

Slide 19

Slide 19 text

MySQLが大事にしよう として、最近そうでもな くなったかも知れないも の 18/65

Slide 20

Slide 20 text

プラガブルスト レージエンジン 19/65

Slide 21

Slide 21 text

プラガブルストレージエンジン 2005年 MySQL 5.0 ARCHIVEストレージエンジン, FEDERATEDストレージエンジン ‐ InnobaseがOracleに買収された年でもある(2005年) おかげさまで(?)ストレージエンジン戦国時代の幕開けに ‐ 2008年 MySQL 5.1 「プラガブルストレージエンジン」APIが公開 ‐ 2018年 MySQL 8.0 データディクショナリーの一新によりストレージエンジンプラグイン冬の時代到来 ‐ 20/65

Slide 22

Slide 22 text

プラガブルストレージエンジン CREATE TABLE .. Engine = ? だけでデータフォーマットが変えられる素敵機能 トランザクション非対応でスキャンに強いMyISAM ‐ トランザクション対応でフツーのRDBMSとして使えるInnoDB ‐ 日本語全文検索といえばMroonga ‐ データウェアハウス用のカラムナーInfiniDB ‐ 一時期、雨後のたけのこのように育ったストレージエンジンのエコシステムは 今はもうかつてほどの勢いはない ‐ 21/65

Slide 23

Slide 23 text

プラガブルストレージエンジン 疎結合だからこそ最適化できなかった部分 InnoDBと密結合だからこそできる最適化 もう「SQLとNoSQLを使い分ける」のは当たり前になったので全部がMySQLイン ターフェイスでなくてもいいんだろうなぁ 22/65

Slide 24

Slide 24 text

MySQLが実は昔 からやってること 23/65

Slide 25

Slide 25 text

周辺ツールの内製(?) MySQL Proxy MySQL Administraotr MySQL Migration Toolkit MySQL Workbench MySQL Utilities MySQL Fabric MySQL Router MySQL Shell 24/65

Slide 26

Slide 26 text

周辺ツールの内製(?) MySQL Proxy MySQL Administraotr MySQL Migration Toolkit MySQL Workbench MySQL Utilities MySQL Fabric MySQL Router MySQL Shell 25/65

Slide 27

Slide 27 text

周辺ツールの内製(?) 開発元が作ってるからって必ずしもメンテナンスされ続けるわけではないけれども MySQL RouterとMySQL Shellは “MySQL InnoDB Cluster” の構成要素でもあり 昨今力を入れているっぽい MySQL RouterはMySQL Fabricの時代にできたけど余計なことをしないからまあ まあ筋が良いと思う(が、簡素すぎるというのもある) コードツリー的にはMySQL Serverと同じリポジトリに統合された ‐ MySQL Shellは “mysqlコマンドラインクライアントを置き換えるんだー” とか 言ってた そのうちコードツリーがマージされたり、本体にバンドルされるようになったりしたらその時 期なのかも ‐ 26/65

Slide 28

Slide 28 text

MySQLが最近売りにし ようとしているんだかし ていないんだかわからな いもの 27/65

Slide 29

Slide 29 text

日本語対応 28/65

Slide 30

Slide 30 text

日本語対応 1997年 3.21.x 最初の日本語対応 2004年 MySQL 4.1 UTF-8(3バイト)登場 ‐ 2010年 MySQL 5.5 utf8mb4登場 ‐ 2018年 MySQL 8.0 utf8mb4がデフォルトの文字コードに ‐ UCA 9.0.0に準拠した照合順序 ‐ 29/65

Slide 31

Slide 31 text

日本語対応 日本語が格納できる、という意味ではなくて mysql> select hex(s),s from ja_0900_as_cs order by s; +--------+------+ | hex(s) | s | +--------+------+ | E4BA9C | 亜 | | E4BC8A | 伊 | | E99BA8 | 雨 | | E6A084 | 栄 | | E5A5A5 | 奥 | +--------+------+ MySQLの日本語コレーション - @tmtms のメモ 30/65

Slide 32

Slide 32 text

日本語対応 ー の並ぶ位置がちゃんと(?)違う… 31/65

Slide 33

Slide 33 text

日本語対応 utf8mb4_ja_0900_as_cs & utf8mb4_ja_0900_as_cs_ks • JIS X 4061の仕様を採用した共通ロケールデータリポジトリ (CLDR / Common Locale Data Repository)の内容を実装 • CLDRはDUCETでの言語ごとにカスタマイズされた情報をXML形式で提供 • 基底文字に加えて以下の判別およびソート順の規定を行う – 清濁: UCA 2次レベル および JIS X 4061 第1照合属性 – 大文字小文字: UCA 3次レベル および JIS X 4061 第2照合属性 • utf8mb4_ja_0900_as_cs_ks は上記に加えひらがなカタカナを判別 – UCA 4次レベル および JIS X 4061 第3照合属性 [db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セット と文字照合 32/65

Slide 34

Slide 34 text

MySQLが割と昔か ら、今もとても大事 にしているもの 33/65

Slide 35

Slide 35 text

レプリケー ション 34/65

Slide 36

Slide 36 text

レプリケーション 少なくとも2001年 MySQL 3.23からレプリケーションはあった 2004年 MySQL 4.1 SSLサポート ‐ 2008年 MySQL 5.1 binlog_format= ROW ‐ 2010年 MySQL 5.5 準同期レプリケーション ‐ 2013年 MySQL 5.6 GTID, MTS, チェックサム, 遅延レプリケーション ‐ 2015年 MySQL 5.7 マルチソースレプリケーション, グループレプリケーション ‐ 2018年 MySQL 8.0 JSONデータ型の部分更新をサポート ‐ 35/65

Slide 37

Slide 37 text

レプリケーション 当初はそれほど売り文句だと思われていなかった? 大きな機能追加が続くようになるのは5.1から ‐ それ以降、性能改善とは別に機能追加が続いている ‐ 価格的に「強いサーバー1台 >> 半分のスペックのサーバー2台」な時代に存在感 を出した PostgreSQLも2010年の9.0までストリーミングレプリケーションを提供していなかったわけで ‐ 36/65

Slide 38

Slide 38 text

レプリケーション 倍々ゲームで「強いサーバー1台 == 半分のスペックのサーバー2台」が成り立つ クラウド利用側にはあまり関係ないようになるかも知れない 自前でデータセンターを運用しているような規模になってくるとやっぱりレプリ ケーションは高機能であれば高機能である程良いので、今後も期待できるのではな いか 37/65

Slide 39

Slide 39 text

MySQLが最 近始めたこと 38/65

Slide 40

Slide 40 text

メンテナンスリリー ス()での新機能追 加 39/65

Slide 41

Slide 41 text

メンテナンスリリース()での新機能追加 $ curl -L -s https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html | perl -nlE 'if ($_ =~ /(8\.0\.\d+)/) { say $1 }' | sort -t "." -k 3 -n | uniq -c 1 8.0.0 3 8.0.2 3 8.0.3 2 8.0.4 2 8.0.12 6 8.0.13 6 8.0.14 9 8.0.16 8 8.0.17 4 8.0.18 8.0.15はガチで8.0.14のリグレッションを1件だけ直した「メンテナンスリリース」だった。よってWhat is Newの中にはない 40/65

Slide 42

Slide 42 text

メンテナンスリリース()での新機能追加 「メンテナンスリリース」 だと言い張る The MySQL 8.0.12 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.13 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.14 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.16 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.17 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.18 Maintenance Release is Generally Available | MySQL Server Blog ‐ 8.0.15はガチで8.0.14のリグレッションを1件だけ直した「メンテナンスリリース」だった。よって公式ブログに記事は無い() 41/65

Slide 43

Slide 43 text

メンテナンスリリース()での新機能追加 本番に導入するまでは面白い 本番に導入したあと、マイナーバージョンアップだと思って追随するのは無理 ‐ Mockじゃなくて本物のMySQLを使ったユニットテストがないと死ねる ‐ 42/65

Slide 44

Slide 44 text

2019年以降の MySQLが強化して いくであろう機能 43/65

Slide 45

Slide 45 text

SQLインターフェ イスだけで出来る機 能の拡充 44/65

Slide 46

Slide 46 text

SQLインターフェイスだけで出来る機能の拡充 もともと SET GLOBAL でオンライン変更できる変数は多い方だったと思う MySQL 5.7とそれ以降では innodb_buffer_pool_size もオンラインで変更できるようになった し ‐ SET GLOBAL を超えて、 mysqld-auto.cnf に設定を永続化できる SET PERSIST, SET PERSIST_ONLY が追加 更には RESTART ステートメントも備えて、 「リードオンリーの設定でさえSQLだ けで設定がいじれる」 45/65

Slide 47

Slide 47 text

SQLインターフェイスだけで出来る機能の拡充 何が嬉しいのか? SQLインターフェイス(= mysqld + クライアント)だけでプロビジョニングが出来る ‐ 「クラウドフレンドリー」ってよく中の人が謳ってるけど、たぶん相手にしている のはPaaSじゃなくてIaaS MySQL + MySQL Shell + MySQL RouterでMySQL InnoDB Clusterなるシングルマスター/マ ルチマスター構成が取れるソリューションを提供 ‐ 46/65

Slide 48

Slide 48 text

2019年のMySQL が備えた機能 47/65

Slide 49

Slide 49 text

RDBMSっ ぽい機能 48/65

Slide 50

Slide 50 text

RDBMSっぽい機能 2018年 MySQL 8.0 CHECK制約 ‐ 降順インデックス ‐ 式インデックス ‐ 共通テーブル式(WITH句) ‐ Window関数(OVER .. PARTITION句) ‐ HASH JOIN ‐ ANTI-JOIN ‐ マルチバリューインデックス ‐ EXPLAIN ANALYZE ‐ 49/65

Slide 51

Slide 51 text

CHECK制約 50/65

Slide 52

Slide 52 text

降順インデックス 51/65

Slide 53

Slide 53 text

式インデックス 52/65

Slide 54

Slide 54 text

共通テーブル式 53/65

Slide 55

Slide 55 text

共通テーブル式 54/65

Slide 56

Slide 56 text

共通テーブル式 55/65

Slide 57

Slide 57 text

Window関数 56/65

Slide 58

Slide 58 text

Window関数 57/65

Slide 59

Slide 59 text

こんな便利なものを〇 racleとP〇stgreSQLは 使っていたのか!!1 58/65

Slide 60

Slide 60 text

RDBMSっぽい機能 MySQL Bugs: #3464: Constraints: support CHECK MySQL Bugs: #13375: Index with Desc sort feature MySQL Bugs: #16244: SQL-99 Derived table WITH clause (CTE) MySQL Bugs: #28957: Ordered Analytical Functions MySQL Bugs: #59025: MySQL does not support the hash join 59/65

Slide 61

Slide 61 text

RDBMSっぽい機能 今までだんまりを決め込んでいたSQL周りがここに来て一気に EXCEPT, INTERCECT, FULL OUTER JOINあたりが実装される日も来るのでは マテビューはどうかな… ‐ 60/65

Slide 62

Slide 62 text

2019年のMySQLが大事にしている(ように見える)もの レプリケーション SQLそのものの強化 SQLだけでできること、の拡充 61/65

Slide 63

Slide 63 text

20年を経て変わっ たもの変わらないも の 62/65

Slide 64

Slide 64 text

これからもよろし くお願いします 63/65

Slide 65

Slide 65 text

参考リンク MySQL - Wikipedia FOSDEM 2015 with MySQL & MySQL 20 years anniversary celebration! MySQL - 日本語対応について 今さらだけどMySQLとライセンス ASCII.jp:MySQLの古いバージョンがGPLでリリース MySQL Reference Manual for version 3.21.31. - The MySQL server license MySQL、PHPとのライセンス問題を解決する新除外条項を発表 - CNET Japan 64/65

Slide 66

Slide 66 text

参考リンク 漢(オトコ)のコンピュータ道: Good Bye MySQL 6.0 MySQL Lists: announce: MySQL 6.0.11 Alpha has been released! デブサミ2011 【17-E-7】 MySQLユーザ会のこれまでとこれから MyNAができるまで MySQLの日本語コレーション - @tmtms のメモ [db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セット と文字照合 MySQL :: MySQL 8.0 Reference Manual :: 1.4 What Is New in MySQL 8.0 MySQL :: MySQL Classic Edition 65/65