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を拡張する

4,146 views

Published on

Published in: Technology
  • Be the first to comment

MySQLを拡張する

  1. 1. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLを拡張する MySQL User Conference 2015 とみたまさひろ 2015-12-15
  2. 2. MySQLを拡張する Powered by Rabbit 2.1.9 自己紹介 とみた まさひろ http://tmtms.hatenablog.com http://twitter.com/tmtms https://github.com/tmtm 長野県北部在住プログラマー( Ruby & C ) 長野ソフトウェア技術者グループ(NSEG)
  3. 3. MySQLを拡張する Powered by Rabbit 2.1.9 自己紹介 日本MySQLユーザ会代表 MySQL 3.21 の日本語対応 (1998) MySQLのRubyバインディング作成 (1998) OSS貢献者賞 2013
  4. 4. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLは「世界でもっとも普及している オープンソースデータベース」 https://www-jp.mysql.com/
  5. 5. MySQLを拡張する Powered by Rabbit 2.1.9 「伽藍とバザール」の「伽藍」
  6. 6. MySQLを拡張する Powered by Rabbit 2.1.9 フリーソフトウェア(GPL2)
  7. 7. MySQLを拡張する Powered by Rabbit 2.1.9 フリーソフトウェアでうれしいこと
  8. 8. MySQLを拡張する Powered by Rabbit 2.1.9 無料(フリー)
  9. 9. MySQLを拡張する Powered by Rabbit 2.1.9 無料でうれしい 個人ごとの開発環境 テスト環境 スケールアウトで台数増
  10. 10. MySQLを拡張する Powered by Rabbit 2.1.9 自由(フリー)
  11. 11. MySQLを拡張する Powered by Rabbit 2.1.9 自由でうれしい ソースが公開されている 自分で調べられる 改変して再配布
  12. 12. MySQLを拡張する Powered by Rabbit 2.1.9 改変 MariaDB AWS RDS 「多様性は善」
  13. 13. MySQLを拡張する Powered by Rabbit 2.1.9 仮に本家の開発が中断したとしても 第三者が継続できる
  14. 14. MySQLを拡張する Powered by Rabbit 2.1.9 拡張
  15. 15. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLに機能を追加する
  16. 16. MySQLを拡張する Powered by Rabbit 2.1.9 UDF - ユーザー定義関数 一番簡単な拡張 独自の関数を MySQL に組み込む 通常の関数 / 集約関数 MySQLのソースを見なくてもマニュアルだけで作 成可能 http://dev.mysql.com/doc/refman/5.6/ja/adding-udf.html
  17. 17. MySQLを拡張する Powered by Rabbit 2.1.9 UDF hoge_init() クエリ実行前に呼び出される(引数チェックとか) hoge() 関数本体 hoge_deinit() クエリ実行後に呼び出される(メモリ解放とか)
  18. 18. MySQLを拡張する Powered by Rabbit 2.1.9 例: mysql-mruby https://github.com/mattn/mysql-mruby mysql> SELECT mrb_eval('ARGV.map(&:upcase).join(",")', -> 'hoge', 'fuga') as a; +-----------+ | a | +-----------+ | HOGE,FUGA | +-----------+
  19. 19. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン
  20. 20. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン(5.7.9) mysql> show plugins; +----------------------------+----------+--------------------+---------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+---------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  21. 21. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン(5.7.9) | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | +----------------------------+----------+--------------------+---------+---------+
  22. 22. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン ストレージエンジンプラグイン InnoDB, MyISAM, CSV, Blackhole, … 全文パーサープラグイン 全文検索用トークナイザ: ngram デーモンプラグイン mysqld プロセス空間内で動作
  23. 23. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン INFORMATION_SCHEMA プラグイン 準同期レプリケーションプラグイン 監査プラグイン 認証プラグイン パスワード検証プラグイン
  24. 24. MySQLを拡張する Powered by Rabbit 2.1.9 プラグインの作り方 リファレンスマニュアル 24.2.4 プラグインの作成 http://dev.mysql.com/doc/refman/5.6/ja/writing-plugins.html
  25. 25. MySQLを拡張する Powered by Rabbit 2.1.9 ストレージエンジンプラグイン
  26. 26. MySQLを拡張する Powered by Rabbit 2.1.9 ストレージエンジンプラグイン InnoDB, MyISAM, Archive, Blackhole, … 標準のストレージエンジンは全部プラグイン
  27. 27. MySQLを拡張する Powered by Rabbit 2.1.9 巷のストレージエンジンプラグイン mroonga http://mroonga.org/ja/ 日本語全文検索エンジン Groonga を MySQL から 使う
  28. 28. MySQLを拡張する Powered by Rabbit 2.1.9 ストレージエンジンの作り方 ドキュメントあり MySQL Internals Manual Chapter 22 Writing a Custom Storage Engine http://dev.mysql.com/doc/internals/en/custom-engine.html でもソースみないと厳しいかも フリーソフトウェアだから見放題!
  29. 29. MySQLを拡張する Powered by Rabbit 2.1.9 デーモンプラグイン
  30. 30. MySQLを拡張する Powered by Rabbit 2.1.9 デーモンプラグイン mysqld プロセス空間内で何かを動かす 通常とは異なる TCP/IP の口を開けて何かすると か 起動直後から定期的に何かするとか
  31. 31. MySQLを拡張する Powered by Rabbit 2.1.9 巷のデーモンプラグイン HandlerSocket https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL Transactd http://www.bizstation.jp/ja/transactd/
  32. 32. MySQLを拡張する Powered by Rabbit 2.1.9 デーモンプラグインの作り方 リファレンスマニュアル 24.2.4.5 デーモンプラグイ ンの作成 http://dev.mysql.com/doc/refman/5.6/ja/writing-daemon-plugins.html init() と deinit() 関数だけ 結構簡単
  33. 33. MySQLを拡張する Powered by Rabbit 2.1.9 以上綺麗な拡張 (mysqldのコンパイル不要)
  34. 34. MySQLを拡張する Powered by Rabbit 2.1.9 綺麗じゃない拡張 (mysqldのコンパイル必要)
  35. 35. MySQLを拡張する Powered by Rabbit 2.1.9 改造
  36. 36. MySQLを拡張する Powered by Rabbit 2.1.9 Charset/Collation リファレンスマニュアル 10.3 文字セットの追加 http://dev.mysql.com/doc/refman/5.6/ja/adding-character-set.html 実は1バイト文字セットはコンパイル要らず /usr/local/mysql/share/charsets/ マルチバイト文字は要コンパイル mysql-5.x.x/strings/CHARSET_INFO.txt どうしても ハハ=パパ=ババ と 🍣=🍺 問題を解決 したい人は改造してみるのもいいかも
  37. 37. MySQLを拡張する Powered by Rabbit 2.1.9 ネットワークプロトコル MySQL Internals Manual Chapter 14 MySQL Client/Server Protocol http://dev.mysql.com/doc/internals/en/client-server-protocol.html MySQLのプロトコル解説 http://slide.rabbit-shocker.org/authors/tommy/mysql-protocol/ MySQLクライアントライブラリが無い処理系で実 装 Ruby/MySQL - pure Ruby 実装 https://github.com/tmtm/ruby-mysql
  38. 38. MySQLを拡張する Powered by Rabbit 2.1.9 クエリ クライアントからのコマンド振り分け mysql-5.x.x/sql/sql_parse.cc クエリ構文解析 mysql-5.x.x/sql/sql_yacc.yy 独自のクエリを組み込める 「予約語書き換えればSQLインジェクション対 策!」
  39. 39. MySQLを拡張する Powered by Rabbit 2.1.9 まとめ
  40. 40. MySQLを拡張する Powered by Rabbit 2.1.9 まとめ プラグイン機構でコンパイルせずに結構拡張でき る ソースが見れるからプラグインも作りやすい mysqld 自体を改造することもできる 無料もいいけど自由重要 フリーソフトウェア万歳!
  41. 41. MySQLを拡張する Powered by Rabbit 2.1.9 おまけ
  42. 42. MySQLを拡張する Powered by Rabbit 2.1.9 アドベントカレンダー 元はクリスマスまでの期間を数える ために使われていたカレンダーのこ とで 〜中略〜 近年、インターネット上において、こ のカレンダーにならい、定められた テーマに従い、参加者が持ち回りで 自身のブログやサイトに記事を投稿 する企画が多く実施されています。 http://blog.qiita.com/post/132928437279/adcal2015
  43. 43. MySQLを拡張する Powered by Rabbit 2.1.9 MySQL 関連のアドベントカレンダー 12/1〜25 まで開催中 MySQL Casual Advent Calendar 2015 http://qiita.com/advent-calendar/2015/mysql-casual MySQL Fabric&Routerつらくない Advent Calendar 2015 http://qiita.com/advent-calendar/2015/mysql_fabric MySQL 5.7の「罠」に狙われてもやられないため の Advent Calendar 2015 http://qiita.com/advent-calendar/2015/mysql57-yoku0825-traps MySQLマニュアルを読む Advent Calendar 2015 http://qiita.com/advent-calendar/2015/mysql_manual
  44. 44. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLだけで4つもある!
  45. 45. MySQLを拡張する Powered by Rabbit 2.1.9 4つのうち3つが 「独りアドベントカレンダー」
  46. 46. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLの人たちちょっとおかしい
  47. 47. MySQLを拡張する Powered by Rabbit 2.1.9 おわり

×