Copyright	
  ©	
  2015,	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
HTTP	
  Plugin	
  /	
  MySQL	
  JSON	
  
Ryusuke	
  Kajiyama	
  /	
  梶山隆輔	
  /	
  @RKajiyama	
  
MySQL	
  Sales	
  ConsulIng	
  Senior	
  Manager,	
  Asia	
  Pacific	
  &	
  Japan	
  
MySQL・PostgreSQLユーザーグループ	
  
(MyNA・JPUG)合同DB勉強会 in	
  東京	
  
MySQL	
  meets	
  NoSQL
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
以下の事項は、弊社の⼀一般的な製品の⽅方向性に関する概要を説明するものです。
また、情報提供を唯⼀一の⽬目的とするものであり、いかなる契約にも組み込むことはできません。
以下の事項は、マテリアルやコード、機能を提供することをコミットメントするものではない為
、購買決定を⾏行行う際の判断材料料になさらないで下さい。
オラクル製品に関して記載されている機能の開発、リリースおよび時期については、
弊社の裁量量により決定されます。
SAFE	
  HARBOR	
  STATEMENT	
  
2	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
The	
  world's	
  most	
  popular	
  open	
  source	
  database	
  
世界で最も普及しているオープンソース データベース	
  
3
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
   4	
20	
  MySQL公開から20年	
  
15	
  日本MySQLユーザ会ドメイン登録から15年	
10	
  オラクルによるInnobase買収から10年	
5	
  オラクルによるサン買収から5年	
	
  A	
  Year	
  of	
  Anniversaries!
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
•  MySQL製品のシンプルで便利なインス
トール&アップグレード方法を提供	
  
•  下記のディストリビューション向け	
  
–  Oracle,	
  Red	
  Hat,	
  CentOS	
  	
  
–  Fedora	
  
–  Ubuntu,	
  Debian	
  
•  まもなく提供開始予定	
  
–  SUSE	
  
–  構成済みコンテナ	
  
–  利用者の多いDevOpsデプロイツールのサ
ポート	
  
•  下記の最新リリースを含む	
  
–  MySQL	
  Database	
  
–  MySQL	
  Workbench	
  
–  MySQL	
  Connector/ODBC	
  
–  MySQL	
  Connector/Python	
  
–  MySQL	
  Connector/NET	
  
–  MySQL	
  UIliIes	
  
	
  
	
  
5	
  
MySQLコミュニティレポジトリ:	
  Yum,	
  APT,	
  NuGET	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
GitHubへのMySQLソースコードの掲載	
  
•  MySQL開発チームのGit	
  
–  各ディストリビューションにてより迅速、柔軟に	
  
–  優れたツールの利用が可能に	
  
–  幅広くいコミュニティとの交流	
  
•  GitHub	
  for	
  MySQL	
  Community	
  
–  コミュニティや関連プロジェクトへのより簡単かつ高速なソースコードの提供	
  
–  ベータ版のレポジトリ: hbps://github.com/mysql	
  
–  詳細:	
  hbp://mysqlrelease.com	
  
6	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  5.6	
  リファレンスマニュアル日本語版	
h?p://dev.mysql.com/doc/refman/5.6/ja/index.html	
7
Copyright	
  ©	
  2015,	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  製品ロードマップ	
  
	
  
	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
   9	
4.0	
  
全文検索/GIS	
  (MyISAM)	
  
複数テーブルUPDATE/DELETE	
  
組み込みライブラリ型サーバ	
Oracle	
  MySQL	
   Sun	
  
3.23	
  
MyISAM	
  
InnoDB	
  
レプリケーション	
  
5.1	
  
プラグガブル・	
  
	
  ストレージエンジン・	
  
	
  アーキテクチャ	
パーティショニング	
  
タスクスケジューラ	
5.6	
  
memcached	
  API	
  
UNDO表領域	
  
Global	
  TransacIon	
  ID	
  
マルチスレッドスレーブ	
  
オンラインALTER	
  TABLE	
  
トランスポータブル表領域	
  
5.5	
  
InnoDBがデフォルトに	
  
準同期型レプリケーション	
  
PERFORMANCE_SCHEMA	
  
1.0-­‐3.22以前	
  
ストレージエンジン	
  (ISAM,	
  HEAP)	
マルチスレッド	
Windows対応/64bit対応	
  
日本語文字コード	
  (SJIS/UJIS)	
5.0	
  
ストアドプロシージャ	
  
ストアドファンクション	
カーソル/トリガ/ビュー	
  
XAトランザクション	
INFORMATION_SCHEMA	
  
4.1	
  
Unicode対応	
  
サブクエリ	
  
CSV,	
  ARCHIVE	
  
ndbcluster	
  
1995	
 2000	
 2005	
 2010	
 2015	
5.7+	
  
新コストモデル オプティマイザ	
  
ロスレス レプリケーション	
  
マルチソース レプリケーション	
  
グループ レプリケーション	
  
全文検索CJK対応/GIS	
  (InnoDB)	
  
セキュリティ強化	
  
データディクショナリ	
  
NoSQLオプション	
  
	
  
	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
•  性能	
  
– ミューテックスの分割	
  
– 参照専用トランザクション	
  
– SSDへの最適化	
  
– UNDO表領域	
  
– サブクエリ高速化	
  
– JSON	
  EXPLAIN	
  
– Memcached	
  API	
  
•  可用性	
– Global	
  TransacIon	
  ID	
  
– 自動フェールオーバー	
  
– マルチスレッド・スレーブ	
  
– Binlog	
  グループ・コミット	
  
– 行ベース・レプリケーショ
ン最適化	
  
– クラッシュセーフ・	
  
スレーブ	
  
– チェックサム	
10	
•  運用効率	
  
– オンラインALTER	
  TABLE	
  
– バッファプールのダンプ	
  
およびインポート	
  
– トランスポータブル	
  
表領域	
  
– セキュリティ強化	
  
•  パスワードポリシー	
  
•  SHA256	
  
•  パスワード失効	
  
MySQL5.6での機能拡張
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  5.7	
  Release	
  Candidate	
  Available!	
  
11	
  
InnoDBの機能拡張:	
  	
  
Online&Bulk	
  load	
  オペレーション高速化	
  
レプリケーションの改善	
  
	
  (mulI-­‐source,	
  mulI-­‐threaded	
  slaves等)	
  
新しいオプティマイザコストモデル:	
  
greater	
  user	
  control	
  &	
  beber	
  query	
  performance	
  
Performance	
  Schema改善	
  
MySQL	
  SYS	
  Schema改善	
  
パフォーマンス	
  &	
  拡張性	
   管理性	
  
MySQL	
  5.6比2倍の速度	
  
セキュリティの向上:	
  	
  
より安全な初期化,	
  セットアップ&管理	
  
NEW!	
  JSONのSupport	
  (now	
  in	
  labs)	
  
RC	
  
And	
  many	
  more	
  new	
  features	
  and	
  enhancements...	
  hbp://mysqlserverteam.com/the-­‐mysql-­‐5-­‐7-­‐7-­‐release-­‐candidate-­‐is-­‐available/	
  	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
InnoDB	
  -­‐	
  Full	
  Text	
  Search	
  (FTS)	
  -­‐	
  ngram	
12	
InnoDB	
  Full	
  Text	
  Search	
  (FTS)	
  にて 中国語,	
  韓国語,日本語をサポート	
  
N-­‐gram	
  support	
  for	
  Chinese	
  and	
  Korean,	
  addiIonal	
  MeCab	
  support	
  for	
  Japanese	
  
CREATE	
  TABLE	
  `N_DEMO`	
  (	
  `FTS_N_ID`	
  bigint(20)	
  unsigned	
  NOT	
  NULL	
  AUTO_INCREMENT,	
  `Itle`	
  varchar(100)	
  DEFAULT	
  NULL,	
  	
  	
  
PRIMARY	
  KEY	
  (`FTS_N_ID`),	
  FULLTEXT	
  KEY	
  `ngram_idx`	
  (`Itle`)	
  /*!50100	
  WITH	
  PARSER	
  `ngram`	
  */	
  	
  
)	
  ENGINE=InnoDB	
  AUTO_INCREMENT=1	
  DEFAULT	
  CHARSET=ur8mb4;	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
InnoDB	
  -­‐	
  Full	
  Text	
  Search	
  (FTS)	
  -­‐	
  mecab	
13	
InnoDB	
  Full	
  Text	
  Search	
  (FTS)	
  にて 中国語,	
  韓国語,日本語をサポート	
  
N-­‐gram	
  support	
  for	
  Chinese	
  and	
  Korean,	
  addiIonal	
  MeCab	
  support	
  for	
  Japanese	
  
CREATE	
  TABLE	
  `M_DEMO`	
  (	
  `FTS_M_ID`	
  bigint(20)	
  unsigned	
  NOT	
  NULL	
  AUTO_INCREMENT,	
  `Itle`	
  varchar(100)	
  DEFAULT	
  NULL,	
  	
  	
  
PRIMARY	
  KEY	
  (`FTS_M_ID`),	
  	
  FULLTEXT	
  KEY	
  `mecab_idx`	
  (`Itle`)	
  /*!50100	
  WITH	
  PARSER	
  `mecab`	
  */	
  	
  
)	
  ENGINE=InnoDB	
  AUTO_INCREMENT=1	
  DEFAULT	
  CHARSET=ur8mb4;	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  Labs	
14
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  Labs	
•  先進的な機能や実験的な仕様のをいち早く公開	
  
– コミュニティからのフィードバックをいただく	
  
•  将来的にはMySQLサーバやMySQL	
  Cluster本体への統合を期待	
  
– MySQL	
  5.6	
  memcached	
  API	
  
– MySQL	
  Cluster	
  7.2	
  memcached	
  API	
  
– MySQL	
  5.6	
  Performance	
  Schema	
  
– MySQL	
  5.6	
  Intra-­‐schema	
  MulI	
  Thread	
  Slave	
  
– MySQL	
  5.6	
  Online	
  Alter	
  Table	
  
– MySQL	
  5.7	
  MulI	
  Source	
  ReplicaIon	
  
– MySQL	
  5.7	
  New	
  OpImizer	
  Cost	
  Model	
15
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
•  シェアード・ナッシング型”疑似”同期レプリケーション	
  
•  更新はマルチ・マスタ型でどこでも可能	
  
–  矛盾の検知と解決(トランザクションのロールバック	
  
–  “OpImisIc	
  State	
  Machine”	
  レプリケーション	
  
•  グループメンバーの管理と障害検知を自動化	
  
–  サーバのフェールオーバー不要	
  
–  構成の拡張/縮小の柔軟性	
  
–  単一障害点無し	
  
–  自動再構成	
  
•  既存構成との統合	
  
–  InnoDB	
  
–  GTIDベースのレプリケーション	
  
–  PERFORMANCE_SCHEMA	
  
MySQL	
  5.7:	
  グループレプリケーション	
  
ApplicaIon	
  
MySQL	
  Masters	
   ReplicaIon	
  	
  
Plugin	
  
API	
  
MySQL	
  
Server	
  
Group	
  Comms	
  
(Corosync)	
  
16	
  
labs.mysql.com	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
HTTP	
  Plugin	
  for	
  MySQL	
  
•  MySQLサーバへのHTTP(S)エンドポイントを提供するプラグイン	
  
•  結果をUTF8でエンコードされたJSONフォーマットにシリアライズ	
  
•  3種類のユーザエンドポイント	
  
– SQL	
  
– CRUD	
  -­‐	
  Key-­‐Value	
  
– JSON	
  -­‐	
  Document	
  
•  For	
  more	
  details;	
  
hbp://www.slideshare.net/nixnutz/hbp-­‐plugin-­‐for-­‐mysql-­‐39598656	
  
17	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
HTTP	
  Plugin	
  for	
  MySQL	
  –	
  エンドポイント	
エンドポイント	
 SQL	
 CRUD	
 JSON	
  ドキュメント	
URLプリフィックス	
 hbp[s]://server:port/sql/	
 hbp[s]://server:port/crud/	
 hbp[s]://server:port/doc/	
データ操作	
 全SQL文利用可能	
 主キーによるCRUD	
 主キーによるCRUD	
データ格納先	
 通常のテーブル	
 通常のテーブル	
 テーブルのJSON列*	
SQL文利用可能	
 Yes	
 No	
 No	
HTTPメソッド	
 GET	
 GET,	
  PUT.	
  DELETE	
 GET,	
  PUT.	
  DELETE	
  
結果セットのメタデータ	
 Yes	
 No	
 Yes	
トランザクション	
 Yes	
 Yes	
 Yes	
文字コード	
 UTF-­‐8	
 UTF-­‐8	
 UTF-­‐8	
ベーシック認証	
 Yes	
 Yes	
 Yes	
18
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
HTTP	
  Plugin	
  for	
  MySQL	
The	
  SQL	
  endpoint	
  and	
  JSON	
  	
19	
shell> curl -X GET --user scott:tiger --url 'http://127.0.0.1:8080/sql/world/
SELECT+ID,Name+FROM+City+WHERE+Name=%27Tokyo%27'
[
{
"meta":[
{"type":,"catalog":"def","database":"world","table":"City","org_table":"ci
ty","column":"ID","org_column":"ID","charset":63,"length":11,"flags":
16899,"decimals":0},
{"type":
254,"catalog":"def","database":"world","table":"City","org_table":"city","column
":"Name","org_column":"Name","charset":33,"length":105,"flags":1,"decimals":0}
],
"data":[
["1532","Tokyo"]
],
"status":[{"server_status":34,"warning_count":0
}
]
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
HTTP	
  Plugin	
  for	
  MySQL	
  -­‐	
  IniIal	
  version	
  
•  HTTP	
  Basic	
  AuthenIcaIon	
  for	
  SSL	
  and	
  Non-­‐SSL	
  	
  
•  No	
  query	
  cache	
  support	
  	
  
•  No	
  commercial	
  thread	
  pool	
  plugin	
  support	
  	
  
•  Not	
  all	
  MySQL	
  pluggable	
  auth	
  methods	
  supported	
  	
  
•  Unlimited:	
  all	
  SQL	
  statements	
  	
  
•  Unlimited:	
  everything	
  the	
  server	
  returns	
  	
  
20	
  
shell> curl --user basic_auth_user:basic_auth_passwd
--url "http://.../sql/db/SELECT+col_float+FROM+sql_types"
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
HTTP	
  Plugin	
  for	
  MySQL	
GET	
  =	
  SELECT	
  
21	
shell> curl ... --url "http://../crud/db/sql_types/1"
{
"id" : "1",
"col_char" : "CHAR(127)" ,
"col_null" : null,
"col_date" : "2014-12-23",
"col_decimal" : "123.45",
"col_float" : "0.9999",
"col_bigint" : "9223372036854775807"
}
shell> curl ... --url 'http://../crud/db/simple/'
{
"errno" : 2000,
"error" : "The request URL must include a primary key value”
}
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  Binlog	
  Events	
従来の名称は Binlog	
  API	
•  バイナリログを読むためのC++ライブラリ	
  
•  マスタ上のバイナリログかファイルを直接読み込み	
  
– 2タイプの"transport"	
  
– TCP	
  Transport	
  &	
  File	
  Transport	
  
•  バイナリログの各イベントをデコード	
  
– イベントをデコードするコードを含む	
  
•  イベントドリブンAPI	
  
hbp://mysqlhighavailability.com/author/nehakumari/	
  
22
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  5.7:	
  JSON	
  
•  参照が中心となる処理に最適化	
  
•  ネイティブJSONデータ型	
  
– バイナリフォーマットで格納され、処理や格納効率の向上を図る	
  
•  ビルトインJSON関数群	
  
– ドキュメントを効率的に検索、格納、更新、各種操作	
  
– SQLでドキュメントのデータを簡単に操作	
  
•  Generated	
  Columns(生成列)を使ってドキュメントのインデックスを作成	
  	
  
– InnoDBはSTOREDとVIRTUALの各タイプのGenerated	
  Columnsを利用可能	
  
– 関数インデックスに該当するインデックスを用意	
  
•  hbp://mysqlserverteam.com/json-­‐labs-­‐release-­‐overview/	
  
23	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  5.7:	
  JSON	
24	
mysql> CREATE TABLE employees (data JSON);
Query OK, 0 rows affected (0,01 sec)
mysql> INSERT INTO employees VALUES ('{"id": 1, "name": "Jane"}');
Query OK, 1 row affected (0,00 sec)
mysql> INSERT INTO employees VALUES ('{"id": 2, "name": "Joe"}');
Query OK, 1 row affected (0,00 sec)
mysql> select * from employees;
+---------------------------+
| data |
+---------------------------+
| {"id": 1, "name": "Jane"} |
| {"id": 2, "name": "Joe"} |
+---------------------------+
2 rows in set (0,00 sec)
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
MySQL	
  5.7:	
  JSON	
•  Document	
  ValidaIon	
  
– on	
  insert	
  only	
  	
  
•  Efficient	
  Access	
  
25	
mysql> INSERT INTO employees VALUES ('some random text');
ERROR 3130 (22032): Invalid JSON text: "Expect a value here." at position 0 in
value (or column) 'some random text'.	
mysql> select jsn_extract(data, '$.name') from employees;
+-----------------------------+
| jsn_extract(data, '$.name') |
+-----------------------------+
| "Jane" |
| "Joe" |
+-----------------------------+
2 rows in set (0,00 sec)
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
•  jsn_array()
–  Build	
  a	
  JSON	
  array	
  from	
  list	
  of	
  expressions	
  
•  jsn_object()
–  Builds	
  JSON	
  objects	
  from	
  a	
  variable	
  length	
  list	
  
of	
  key/value	
  pairs	
  
•  jsn_insert()
–  Adds	
  'missing'	
  data	
  to	
  JSON	
  documents	
  
•  jsn_remove()
–  Removes	
  abributes	
  from	
  exisIng	
  JSON	
  
documents	
  
•  jsn_set()
–  Sets	
  abributes	
  within	
  JSON	
  documents	
  
•  jsn_replace()
–  Replaces	
  (but	
  doesn't	
  add)	
  abributes	
  within	
  
JSON	
  documents	
  
•  jsn_append()
–  Adds	
  a	
  value	
  to	
  the	
  end	
  of	
  an	
  array	
  
•  jsn_merge()
–  Merges	
  two	
  arrays	
  	
  
•  jsn_extract()
–  Returns	
  a	
  value	
  nested	
  inside	
  of	
  a	
  JSON	
  
document	
  
26	
  
JSON	
  FuncIons	
  for	
  CreaIng	
  &	
  ManipulaIng	
  
	
  JSON	
  Documents	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
•  jsn_search()
–  Search	
  for	
  values	
  within	
  JSON	
  documents	
  and	
  
return	
  their	
  locaIons	
  
•  jsn_contains()
–  Checks	
  for	
  a	
  specific	
  element	
  and	
  value	
  
•  jsn_contains_path()
–  Determine	
  if	
  a	
  specific	
  element	
  is	
  present	
  in	
  a	
  
document	
  in	
  a	
  specific	
  posiIon	
  
•  jsn_valid()
–  Check	
  if	
  document	
  is	
  a	
  valid	
  JSON	
  document	
  
•  jsn_type()
–  Find	
  the	
  type	
  of	
  a	
  value	
  within	
  a	
  document	
  
•  jsn_keys()
–  Returns	
  arrays	
  of	
  the	
  key	
  names	
  for	
  the	
  JSON	
  
documents	
  
•  jsn_length()
–  Number	
  of	
  elements	
  in	
  JSON	
  document	
  
•  jsn_depth()
–  Level	
  of	
  nesIng	
  in	
  JSON	
  document	
  
•  jsn_unquote()
–  Helps	
  move	
  from	
  JSON	
  to	
  other	
  MySQL	
  types	
  
•  jsn_quote()
–  Helps	
  move	
  from	
  other	
  MySQL	
  types	
  to	
  JSON	
  
27	
  
Query	
  and	
  Search	
  JSON	
  FuncIons	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
Generated	
  Columns	
  
•  Virtual	
  Generated	
  Column	
  
– Generated	
  on	
  the	
  fly	
  when	
  the	
  column	
  is	
  read	
  
– Can	
  be	
  indexed	
  
•  Stored	
  Generated	
  Column	
  
– Generated	
  when	
  the	
  referenced	
  column	
  is	
  wriben	
  to	
  
– Can	
  be	
  indexed	
  
mysql> ALTER TABLE employees ADD name VARCHAR(100)
GENERATED ALWAYS AS(jsn_extract(info, '$.name')) VIRTUAL;
mysql> ALTER TABLE employees ADD INDEX(name);
hbp://mysqlserverteam.com/	
  
28	
  
Digging	
  into	
  your	
  Documents	
  
labs.mysql.com	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
•  コストやストレージを削減し、アプリ
ケーション開発を簡単に	
  
– ドキュメント間でのJOIN	
  
– ドキュメント間での外部キー制約	
  
– 同一トランザクション内で複数のドキュ
メントの更新	
  
•  全てのデータを活用可能に	
  
– 単一のクエリ/トランザクションでドキュ
メント内のデータとデーブルのデータを
参照更新	
  
29	
  
また新しいドキュメントデータベースが増える?	
  
Copyright	
  ©	
  2015	
  Oracle	
  and/or	
  its	
  affiliates.	
  All	
  rights	
  reserved.	
  	
  |	
  
The	
  world's	
  most	
  popular	
  open	
  source	
  database	
  
世界で最も普及しているオープンソース データベース	
  
30

MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL

  • 1.
    Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   HTTP  Plugin  /  MySQL  JSON   Ryusuke  Kajiyama  /  梶山隆輔  /  @RKajiyama   MySQL  Sales  ConsulIng  Senior  Manager,  Asia  Pacific  &  Japan   MySQL・PostgreSQLユーザーグループ   (MyNA・JPUG)合同DB勉強会 in  東京   MySQL  meets  NoSQL
  • 2.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   以下の事項は、弊社の⼀一般的な製品の⽅方向性に関する概要を説明するものです。 また、情報提供を唯⼀一の⽬目的とするものであり、いかなる契約にも組み込むことはできません。 以下の事項は、マテリアルやコード、機能を提供することをコミットメントするものではない為 、購買決定を⾏行行う際の判断材料料になさらないで下さい。 オラクル製品に関して記載されている機能の開発、リリースおよび時期については、 弊社の裁量量により決定されます。 SAFE  HARBOR  STATEMENT   2  
  • 3.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   The  world's  most  popular  open  source  database   世界で最も普及しているオープンソース データベース   3
  • 4.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   4 20  MySQL公開から20年   15  日本MySQLユーザ会ドメイン登録から15年 10  オラクルによるInnobase買収から10年 5  オラクルによるサン買収から5年  A  Year  of  Anniversaries!
  • 5.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   •  MySQL製品のシンプルで便利なインス トール&アップグレード方法を提供   •  下記のディストリビューション向け   –  Oracle,  Red  Hat,  CentOS     –  Fedora   –  Ubuntu,  Debian   •  まもなく提供開始予定   –  SUSE   –  構成済みコンテナ   –  利用者の多いDevOpsデプロイツールのサ ポート   •  下記の最新リリースを含む   –  MySQL  Database   –  MySQL  Workbench   –  MySQL  Connector/ODBC   –  MySQL  Connector/Python   –  MySQL  Connector/NET   –  MySQL  UIliIes       5   MySQLコミュニティレポジトリ:  Yum,  APT,  NuGET  
  • 6.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   GitHubへのMySQLソースコードの掲載   •  MySQL開発チームのGit   –  各ディストリビューションにてより迅速、柔軟に   –  優れたツールの利用が可能に   –  幅広くいコミュニティとの交流   •  GitHub  for  MySQL  Community   –  コミュニティや関連プロジェクトへのより簡単かつ高速なソースコードの提供   –  ベータ版のレポジトリ: hbps://github.com/mysql   –  詳細:  hbp://mysqlrelease.com   6  
  • 7.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  5.6  リファレンスマニュアル日本語版 h?p://dev.mysql.com/doc/refman/5.6/ja/index.html 7
  • 8.
    Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  製品ロードマップ      
  • 9.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   9 4.0   全文検索/GIS  (MyISAM)   複数テーブルUPDATE/DELETE   組み込みライブラリ型サーバ Oracle  MySQL   Sun   3.23   MyISAM   InnoDB   レプリケーション   5.1   プラグガブル・    ストレージエンジン・    アーキテクチャ パーティショニング   タスクスケジューラ 5.6   memcached  API   UNDO表領域   Global  TransacIon  ID   マルチスレッドスレーブ   オンラインALTER  TABLE   トランスポータブル表領域   5.5   InnoDBがデフォルトに   準同期型レプリケーション   PERFORMANCE_SCHEMA   1.0-­‐3.22以前   ストレージエンジン  (ISAM,  HEAP) マルチスレッド Windows対応/64bit対応   日本語文字コード  (SJIS/UJIS) 5.0   ストアドプロシージャ   ストアドファンクション カーソル/トリガ/ビュー   XAトランザクション INFORMATION_SCHEMA   4.1   Unicode対応   サブクエリ   CSV,  ARCHIVE   ndbcluster   1995 2000 2005 2010 2015 5.7+   新コストモデル オプティマイザ   ロスレス レプリケーション   マルチソース レプリケーション   グループ レプリケーション   全文検索CJK対応/GIS  (InnoDB)   セキュリティ強化   データディクショナリ   NoSQLオプション      
  • 10.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   •  性能   – ミューテックスの分割   – 参照専用トランザクション   – SSDへの最適化   – UNDO表領域   – サブクエリ高速化   – JSON  EXPLAIN   – Memcached  API   •  可用性 – Global  TransacIon  ID   – 自動フェールオーバー   – マルチスレッド・スレーブ   – Binlog  グループ・コミット   – 行ベース・レプリケーショ ン最適化   – クラッシュセーフ・   スレーブ   – チェックサム 10 •  運用効率   – オンラインALTER  TABLE   – バッファプールのダンプ   およびインポート   – トランスポータブル   表領域   – セキュリティ強化   •  パスワードポリシー   •  SHA256   •  パスワード失効   MySQL5.6での機能拡張
  • 11.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  5.7  Release  Candidate  Available!   11   InnoDBの機能拡張:     Online&Bulk  load  オペレーション高速化   レプリケーションの改善    (mulI-­‐source,  mulI-­‐threaded  slaves等)   新しいオプティマイザコストモデル:   greater  user  control  &  beber  query  performance   Performance  Schema改善   MySQL  SYS  Schema改善   パフォーマンス  &  拡張性   管理性   MySQL  5.6比2倍の速度   セキュリティの向上:     より安全な初期化,  セットアップ&管理   NEW!  JSONのSupport  (now  in  labs)   RC   And  many  more  new  features  and  enhancements...  hbp://mysqlserverteam.com/the-­‐mysql-­‐5-­‐7-­‐7-­‐release-­‐candidate-­‐is-­‐available/    
  • 12.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   InnoDB  -­‐  Full  Text  Search  (FTS)  -­‐  ngram 12 InnoDB  Full  Text  Search  (FTS)  にて 中国語,  韓国語,日本語をサポート   N-­‐gram  support  for  Chinese  and  Korean,  addiIonal  MeCab  support  for  Japanese   CREATE  TABLE  `N_DEMO`  (  `FTS_N_ID`  bigint(20)  unsigned  NOT  NULL  AUTO_INCREMENT,  `Itle`  varchar(100)  DEFAULT  NULL,       PRIMARY  KEY  (`FTS_N_ID`),  FULLTEXT  KEY  `ngram_idx`  (`Itle`)  /*!50100  WITH  PARSER  `ngram`  */     )  ENGINE=InnoDB  AUTO_INCREMENT=1  DEFAULT  CHARSET=ur8mb4;  
  • 13.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   InnoDB  -­‐  Full  Text  Search  (FTS)  -­‐  mecab 13 InnoDB  Full  Text  Search  (FTS)  にて 中国語,  韓国語,日本語をサポート   N-­‐gram  support  for  Chinese  and  Korean,  addiIonal  MeCab  support  for  Japanese   CREATE  TABLE  `M_DEMO`  (  `FTS_M_ID`  bigint(20)  unsigned  NOT  NULL  AUTO_INCREMENT,  `Itle`  varchar(100)  DEFAULT  NULL,       PRIMARY  KEY  (`FTS_M_ID`),    FULLTEXT  KEY  `mecab_idx`  (`Itle`)  /*!50100  WITH  PARSER  `mecab`  */     )  ENGINE=InnoDB  AUTO_INCREMENT=1  DEFAULT  CHARSET=ur8mb4;  
  • 14.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  Labs 14
  • 15.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  Labs •  先進的な機能や実験的な仕様のをいち早く公開   – コミュニティからのフィードバックをいただく   •  将来的にはMySQLサーバやMySQL  Cluster本体への統合を期待   – MySQL  5.6  memcached  API   – MySQL  Cluster  7.2  memcached  API   – MySQL  5.6  Performance  Schema   – MySQL  5.6  Intra-­‐schema  MulI  Thread  Slave   – MySQL  5.6  Online  Alter  Table   – MySQL  5.7  MulI  Source  ReplicaIon   – MySQL  5.7  New  OpImizer  Cost  Model 15
  • 16.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   •  シェアード・ナッシング型”疑似”同期レプリケーション   •  更新はマルチ・マスタ型でどこでも可能   –  矛盾の検知と解決(トランザクションのロールバック   –  “OpImisIc  State  Machine”  レプリケーション   •  グループメンバーの管理と障害検知を自動化   –  サーバのフェールオーバー不要   –  構成の拡張/縮小の柔軟性   –  単一障害点無し   –  自動再構成   •  既存構成との統合   –  InnoDB   –  GTIDベースのレプリケーション   –  PERFORMANCE_SCHEMA   MySQL  5.7:  グループレプリケーション   ApplicaIon   MySQL  Masters   ReplicaIon     Plugin   API   MySQL   Server   Group  Comms   (Corosync)   16   labs.mysql.com  
  • 17.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   HTTP  Plugin  for  MySQL   •  MySQLサーバへのHTTP(S)エンドポイントを提供するプラグイン   •  結果をUTF8でエンコードされたJSONフォーマットにシリアライズ   •  3種類のユーザエンドポイント   – SQL   – CRUD  -­‐  Key-­‐Value   – JSON  -­‐  Document   •  For  more  details;   hbp://www.slideshare.net/nixnutz/hbp-­‐plugin-­‐for-­‐mysql-­‐39598656   17  
  • 18.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   HTTP  Plugin  for  MySQL  –  エンドポイント エンドポイント SQL CRUD JSON  ドキュメント URLプリフィックス hbp[s]://server:port/sql/ hbp[s]://server:port/crud/ hbp[s]://server:port/doc/ データ操作 全SQL文利用可能 主キーによるCRUD 主キーによるCRUD データ格納先 通常のテーブル 通常のテーブル テーブルのJSON列* SQL文利用可能 Yes No No HTTPメソッド GET GET,  PUT.  DELETE GET,  PUT.  DELETE   結果セットのメタデータ Yes No Yes トランザクション Yes Yes Yes 文字コード UTF-­‐8 UTF-­‐8 UTF-­‐8 ベーシック認証 Yes Yes Yes 18
  • 19.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   HTTP  Plugin  for  MySQL The  SQL  endpoint  and  JSON   19 shell> curl -X GET --user scott:tiger --url 'http://127.0.0.1:8080/sql/world/ SELECT+ID,Name+FROM+City+WHERE+Name=%27Tokyo%27' [ { "meta":[ {"type":,"catalog":"def","database":"world","table":"City","org_table":"ci ty","column":"ID","org_column":"ID","charset":63,"length":11,"flags": 16899,"decimals":0}, {"type": 254,"catalog":"def","database":"world","table":"City","org_table":"city","column ":"Name","org_column":"Name","charset":33,"length":105,"flags":1,"decimals":0} ], "data":[ ["1532","Tokyo"] ], "status":[{"server_status":34,"warning_count":0 } ]
  • 20.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   HTTP  Plugin  for  MySQL  -­‐  IniIal  version   •  HTTP  Basic  AuthenIcaIon  for  SSL  and  Non-­‐SSL     •  No  query  cache  support     •  No  commercial  thread  pool  plugin  support     •  Not  all  MySQL  pluggable  auth  methods  supported     •  Unlimited:  all  SQL  statements     •  Unlimited:  everything  the  server  returns     20   shell> curl --user basic_auth_user:basic_auth_passwd --url "http://.../sql/db/SELECT+col_float+FROM+sql_types"
  • 21.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   HTTP  Plugin  for  MySQL GET  =  SELECT   21 shell> curl ... --url "http://../crud/db/sql_types/1" { "id" : "1", "col_char" : "CHAR(127)" , "col_null" : null, "col_date" : "2014-12-23", "col_decimal" : "123.45", "col_float" : "0.9999", "col_bigint" : "9223372036854775807" } shell> curl ... --url 'http://../crud/db/simple/' { "errno" : 2000, "error" : "The request URL must include a primary key value” }
  • 22.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  Binlog  Events 従来の名称は Binlog  API •  バイナリログを読むためのC++ライブラリ   •  マスタ上のバイナリログかファイルを直接読み込み   – 2タイプの"transport"   – TCP  Transport  &  File  Transport   •  バイナリログの各イベントをデコード   – イベントをデコードするコードを含む   •  イベントドリブンAPI   hbp://mysqlhighavailability.com/author/nehakumari/   22
  • 23.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  5.7:  JSON   •  参照が中心となる処理に最適化   •  ネイティブJSONデータ型   – バイナリフォーマットで格納され、処理や格納効率の向上を図る   •  ビルトインJSON関数群   – ドキュメントを効率的に検索、格納、更新、各種操作   – SQLでドキュメントのデータを簡単に操作   •  Generated  Columns(生成列)を使ってドキュメントのインデックスを作成     – InnoDBはSTOREDとVIRTUALの各タイプのGenerated  Columnsを利用可能   – 関数インデックスに該当するインデックスを用意   •  hbp://mysqlserverteam.com/json-­‐labs-­‐release-­‐overview/   23  
  • 24.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  5.7:  JSON 24 mysql> CREATE TABLE employees (data JSON); Query OK, 0 rows affected (0,01 sec) mysql> INSERT INTO employees VALUES ('{"id": 1, "name": "Jane"}'); Query OK, 1 row affected (0,00 sec) mysql> INSERT INTO employees VALUES ('{"id": 2, "name": "Joe"}'); Query OK, 1 row affected (0,00 sec) mysql> select * from employees; +---------------------------+ | data | +---------------------------+ | {"id": 1, "name": "Jane"} | | {"id": 2, "name": "Joe"} | +---------------------------+ 2 rows in set (0,00 sec)
  • 25.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   MySQL  5.7:  JSON •  Document  ValidaIon   – on  insert  only     •  Efficient  Access   25 mysql> INSERT INTO employees VALUES ('some random text'); ERROR 3130 (22032): Invalid JSON text: "Expect a value here." at position 0 in value (or column) 'some random text'. mysql> select jsn_extract(data, '$.name') from employees; +-----------------------------+ | jsn_extract(data, '$.name') | +-----------------------------+ | "Jane" | | "Joe" | +-----------------------------+ 2 rows in set (0,00 sec)
  • 26.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   •  jsn_array() –  Build  a  JSON  array  from  list  of  expressions   •  jsn_object() –  Builds  JSON  objects  from  a  variable  length  list   of  key/value  pairs   •  jsn_insert() –  Adds  'missing'  data  to  JSON  documents   •  jsn_remove() –  Removes  abributes  from  exisIng  JSON   documents   •  jsn_set() –  Sets  abributes  within  JSON  documents   •  jsn_replace() –  Replaces  (but  doesn't  add)  abributes  within   JSON  documents   •  jsn_append() –  Adds  a  value  to  the  end  of  an  array   •  jsn_merge() –  Merges  two  arrays     •  jsn_extract() –  Returns  a  value  nested  inside  of  a  JSON   document   26   JSON  FuncIons  for  CreaIng  &  ManipulaIng    JSON  Documents  
  • 27.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   •  jsn_search() –  Search  for  values  within  JSON  documents  and   return  their  locaIons   •  jsn_contains() –  Checks  for  a  specific  element  and  value   •  jsn_contains_path() –  Determine  if  a  specific  element  is  present  in  a   document  in  a  specific  posiIon   •  jsn_valid() –  Check  if  document  is  a  valid  JSON  document   •  jsn_type() –  Find  the  type  of  a  value  within  a  document   •  jsn_keys() –  Returns  arrays  of  the  key  names  for  the  JSON   documents   •  jsn_length() –  Number  of  elements  in  JSON  document   •  jsn_depth() –  Level  of  nesIng  in  JSON  document   •  jsn_unquote() –  Helps  move  from  JSON  to  other  MySQL  types   •  jsn_quote() –  Helps  move  from  other  MySQL  types  to  JSON   27   Query  and  Search  JSON  FuncIons  
  • 28.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   Generated  Columns   •  Virtual  Generated  Column   – Generated  on  the  fly  when  the  column  is  read   – Can  be  indexed   •  Stored  Generated  Column   – Generated  when  the  referenced  column  is  wriben  to   – Can  be  indexed   mysql> ALTER TABLE employees ADD name VARCHAR(100) GENERATED ALWAYS AS(jsn_extract(info, '$.name')) VIRTUAL; mysql> ALTER TABLE employees ADD INDEX(name); hbp://mysqlserverteam.com/   28   Digging  into  your  Documents   labs.mysql.com  
  • 29.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   •  コストやストレージを削減し、アプリ ケーション開発を簡単に   – ドキュメント間でのJOIN   – ドキュメント間での外部キー制約   – 同一トランザクション内で複数のドキュ メントの更新   •  全てのデータを活用可能に   – 単一のクエリ/トランザクションでドキュ メント内のデータとデーブルのデータを 参照更新   29   また新しいドキュメントデータベースが増える?  
  • 30.
    Copyright  ©  2015  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   The  world's  most  popular  open  source  database   世界で最も普及しているオープンソース データベース   30