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 Casual Talks LT 20120627

6,085 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

MySQL Casual Talks LT 20120627

  1. 1. BKA JOINについて MySQL Casual Talks @gumi福岡 2012/06/27
  2. 2. 自己紹介名前: 松崎 学所属: 株式会社キャム (SaaS型の経営管理システムを提供中) http://www.cam-net.co.jp/Twitter: matsumana最近のお仕事:Javaプログラマ(Rubyもほんの少し)、 インフラ最近の興味: Scala, Ruby, Python, Play, Node.js, AWS, Hadoop, Asakusa Framework, MongoDB, Fluentd, Vyatta
  3. 3. データベースと私Oracle歴14年 (7.1∼ on Windows , Solaris, Linux)PostgreSQL歴1.5年 (9.0∼ on Linux)MySQL歴1ヶ月程 (今回のLTをきっかけに勉強を始めました)
  4. 4. 初学者ですが、よろしくお願いします m(_ _)mhttp://www.flickr.com/photos/dapperscoo/166797625/
  5. 5. JOINアルゴリズムあれこれ SQL実行計画に出てくるアレです 片方のテーブルを外部表(駆動表)とし、 もう片方のテーブルをループで回してJOINする。Nested Loop JOIN (要するに2重ループ) 外側のループ=外部表 内側のループ=内部表 まず、両方のテーブルをJOIN項目でソートして、Merge JOIN 先頭から順次読み込んでJOINする。 まず、JOIN項目でHashテーブルを作成し、Hash JOIN そのHashテーブルを元にJOINする。
  6. 6. MySQLにはNested Loop Joinしかない。※だから遅いという事では決してありません。クエリ次第だと思います。
  7. 7. しかし、 Block Nested Loop Join が実装されているので、特定の条件を満たせば、内部表のループ回数が大幅に 減少する。
  8. 8. MySQL 5.1 リファレンスマニュアル 抜粋 http://dev.mysql.com/doc/refman/5.1-olh/ja/nested- loop-joins.html ブロック入れ子ループ join アルゴリズムブロック入れ子ループ (BNL、Block Nested-Loop) join アルゴリズムは、外側のループで読み取った行のバッファリングを使用して、内側のループで必要となるテーブルの読み取り回数を減らします。たとえば、バッファーに 10 行を読み込み、このバッファーを次の内側ループに渡すと、内側ループで読み取る各行をバッファー内の 10 行すべてと比較できます。これにより、内側のテーブルを読み取る必要のある回数が大幅に減少します。
  9. 9. 新しいJOINアルゴリズム登場! Batched Key Access JOIN (BKA JOIN) 5.6.3 m6から利用可能。 5.6は2011/04にリリースされた、 まだDevelopment Releaseなバージョンです。 ※今日時点の最新は 「5.6.5 m8」
  10. 10. BKA JOINとは?http://nippondanji.blogspot.jp/2011/10/mysqlmysql-563-m6.htmlBKA JOINは変形NLJ(Nested Loop JOIN)とも言うべきもので、内部表からのレコードのフェッチをひとつずつではなくまとめて行う。先に駆動表から結合するキーの値をいくつかピックアップし、それを内部表に対してまとめて渡す。(IndexCondition Pushdownする。)すると、内部表ではMRR(Multi Range Read)最適化によってアクセスがソートされ、必要なレコードを最適な順序でフェッチすることになり、JOINが高速化するというわけだ。InnoDBやMyISAMでは、MRRによる高速化が見込めるのははセカンダリインデックスによるアクセス時だけである。(主キーでアクセスする場合には別段変わらない。)従って内部表のセカンダリインデックスを使って結合する場合には高速化が見込めるだろう。BKAが使われているかどうかは、EXPLAINでExtraフィールドを見れば分かる。
  11. 11. http://nippondanji.blogspot.jp/2011/04/mysql-56.html ICP (Index Condition Pushdown) これまでストレージエンジンからフェッチしたレコードをMySQLが 評価してWHERE句の条件による絞り込みを行っていたが、インデッ クスが貼られたカラムを用いた評価については、ストレージエンジン へ条件式を渡し(プッシュダウンし)、ストレージエンジン側で評価 を行わせることによってオーバーヘッドの低減をはかる。 MRR (Multi Range Read) セカンダリインデックスの条件に合致するレコードを複数フェッチす る場合、レコードはセカンダリインデックスとは無関係に並んでいる ため、多くのランダムI/Oが発生する。先にセカンダリインデックス のキーだけを読み取って、主キーの順にソートしてからレコードを フェッチすることにより、ランダムディスクI/Oの低減を期待できる。
  12. 12. MySQL 5.6 Reference ManualBatched Key Access Joinshttp://dev.mysql.com/doc/refman/5.6/en/bka-optimization.htmlIndex Condition Pushdown Optimizationhttp://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.htmlMulti-Range Read Optimizationhttp://dev.mysql.com/doc/refman/5.6/en/mrr-optimization.html
  13. 13. 要約するとBKA JOINは駆動表のJOINキーをバッファリングした後、ストレージエンジンにまとめて送る。内部表のフェッチはストレージエンジンで行われる。ストレージエンジンとのやり取り回数が減るので、オーバーヘッドが低減。内部表はMRRにより最適な順番でフェッチされるため、ランダムアクセスI/Oが低減。
  14. 14. BNL JOINよりだいぶ早そうですね!!
  15. 15. BKA JONがICPとMRRの上に立脚しているイメージ BKA JOIN ICP + MRRhttp://www.flickr.com/photos/robwithtwobs/310185817/
  16. 16. お薦め書籍 本当はソースを理解して、内部までお話したかったのですが、 力不足でした・・・><興味のある方は sql/sql_select.cc あたりからぜひ読んでみてください。
  17. 17. NetBeansやEclipseを使えばカジュアルにソースが読めます
  18. 18. まとめ MySQLは ドキュメント、書籍、ブログエントリが充実していて、 初学者でも取っ付きやすい カジュアルな データベースである。
  19. 19. Facebookのグループにも ぜひご参加ください福岡インフラ勉強会https://www.facebook.com/groups/100825430047874/
  20. 20. ご清聴ありがとうございました。

×