ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2011-04-12

MySQL 5.6登場!!新機能速攻レビュー

現在、米国で行われているMySQL Conference & Expoにあわせて、新しい開発版であるMySQL 5.6が発表された。MySQL 5.5における新機能もかなりのものだったが、MySQL 5.6の進化は質・量ともに勝とも劣らない内容となっている。そこで、今日は簡単に、MySQL 5.6で追加された新機能の概要について見てみよう。開発版なので利用にあたっては十分な注意が必要(予期なく予定が変更される可能性あり)だが、次期正式版のリリースに向けて是非試してみて欲しい。

InnoDB関連

MySQL 5.5で大幅な進化を遂げたInnoDBだが、その勢いはまったく衰えることを知らない。性能の強化だけでなく、痒いところに手が届く便利な機能が追加されている。

  • ダーティページのフラッシュをするスレッドが独立した。以前はマスタースレッド内でフラッシュが行われていたが、スレッドが独立したことによって、フラッシュ性能の向上と、フラッシュによって他の処理が遅れる問題が解消されることになる。
  • パージスレッドの数を増やすことが出来るようになった。これにより、パージ処理が並列で実行されるようになり、パージの高速化が期待できる。スレッド数はinnodb_purge_threadsオプションで指定する。
  • InnoDBカーネルmutexが複数のmutexとrw-lockへと分割された。これにより、ロックの競合が低減され、処理の並列性が向上するだろう。
  • デッドロックを検知した際、その情報をエラーログへ記録できるようになった。有効化のためのオプションはinnodb_print_all_deadlocks。
  • インデックス統計情報を保存し、再起動後に再利用できるようになった。これにより、インデックス統計情報がより安定し、実行計画も一定になることが期待できる。
  • InnoDBのメタデータ情報(ディクショナリ)をLRUによってメモリから解放できるようになった。これまで、テーブル数が多いとメタデータが大きくなり、メモリをたくさん消費する問題があったが、これが解消される見通しである。
  • 数多くのINFORMATION_SCHEMAテーブルが追加された。

なお、新たに追加されたINFORMATION_SCHEMAテーブルは次の通り。

  • パフォーマンス関連
    • INNODB_METRICS
  • バッファプール情報
    • INNODB_BUFFER_PAGE
    • INNODB_BUFFER_PAGE_LRU
    • INNODB_BUFFER_POOL_STATS
  • ディクショナリ情報
    • INNODB_SYS_TABLES
    • INNODB_SYS_TABLESTATS
    • INNODB_SYS_INDEXES
    • INNODB_SYS_COLUMNS
    • INNODB_SYS_FIELDS
    • INNODB_SYS_FOREIGN
    • INNODB_SYS_FOREIGN_COLS

オプティマイザの強化

クエリを高速化するための、次の3つのアルゴリズムが追加された。

  • Index Condition Pushdown(ICP): これまでストレージエンジンからフェッチしたレコードをMySQLが評価してWHERE区の条件による絞り込みを行っていたが、インデックスが貼られたカラムを用いた評価については、ストレージエンジンへ条件式を渡し(プッシュダウンし)、ストレージエンジン側で評価を行わせることによってオーバーヘッドの低減をはかる。
  • Multi-Range Read(MRR): セカンダリインデックスの条件に合致するレコードを複数フェッチする場合、レコードはセカンダリインデックスとは無関係に並んでいるため、多くのランダムI/Oが発生する。先にセカンダリインデックスのキーだけを読み取って、主キーの順にソートしてからレコードをフェッチすることにより、ランダムディスクI/Oの低減を期待できる。
  • インデックスがはられていないカラムによるソートORDER BY c LIMIT xの高速化。X個のレコードがソートバッファに収まる場合、処理が高速化される。

オプティマイザの挙動はoptimizer_switchシステム変数で調整するのだが、最適化アルゴリズムが増えたため、SHOW [GLOBAL] VARIABLESの出力結果がクソ長くなってしまった。嬉し悲しッ!!

memcachedインターフェイス

MySQLに対してNoSQLアクセスを行うための方法として、memcached互換のプロトコルが追加された。現時点ではテクニカルプレビューであり、正確にはMySQL 5.6に搭載された機能というわけではない。Labsからmemcached APIが有効になったバイナリをゲッツして使おう。使い方などはプレビュー版に含まれるREADME-innodb_memcachedを読もう。開発者による解説記事はこちら

はっきり言ってHandlersocket Pluginとかなりキャラが被っているが、こちらはmemcached互換のプロトコルとなっている。仕組みも内部的にバッチ処理をする(トランザクション対応ではない!)など、とても似通っている。

パーティショニングの強化

パーティショニングでは、2つの機能が追加されている。ひとつは、ALTER TABLE ... EXCHANGE PARTITION文によって、パーティションと通常のテーブルのデータをそっくりそのまま交換するというものだ。データを交換するテーブルは、パーティション以外はすべて同じ定義でなければならない。

mysql> ALTER TABLE t_partitioned EXCHANGE PARTITION p WITH TABLE t_no_part;

このようにすることで、t_no_partのデータがパーティションpと置き換わる。

もうひとつは、クエリ実行時に対象のパーティションを明示的に指定できるようになったというものだ。

mysql> SELECT * FROM employees PARTITION (p0, p2);

SELECTだけでなく、DELETE、INSERT、REPLACE、UPDATE、LOAD DATA、LOAD XMLなどの各種構文で利用可能だ。

レプリケーションの強化

レプリケーションも機能追加が止まらない。MySQL 5.6における強化はなんと8つもある。

  • バイナリログのフォーマットが変更され、クラッシュセーフになった。CRC32によるチェックサムを追加することも可能。(--slave-sql-verify-checksum)
  • RBR(行ベースレプリケーション)のフォーマットが調整可能になり、変更箇所だけを記録できるようになった。これにより、ディスクスペース、メモリ、ネットワーク帯域幅などを節約できる。
  • master.info、relaylog.infoをファイルではなくテーブルに記録することが出来るようになった。--master-info-repositoryおよび--relay-log-info-repositoryオプションでTABLEを指定する。それぞれテーブルをInnoDBに変更することにより、クラッシュセーフになる。
  • スレーブが複数のNICを持っている場合、マスターとの接続に利用するNICを選択可能。(CHANGE MASTER TO ... MASTER_BIND=...)
  • サーバーのUUIDを生成。(SHOW SLAVE STATUSで識別するのに利用する。)
  • 遅延レプリケーション。わざとレプリケーションを遅らせることで、マスターでオペミスなどをした場合に素早くデータを復旧できる。
  • mysqlbinlogコマンドでMySQLサーバーからバイナリログを直接ゲット可能に。
  • RBR利用時に、その更新の元になったステートメントに関する情報をバイナリログに記録可能に。

PERFORMANCE_SCHEMA来たる!

イマイチ使いどころがなかったPERFORMANCE_SCHEMAであるが、MySQL 5.6では非常に重要な機能追加がなされ、実践投入するに値するようになった。最も重要なものは、テーブルごとの統計情報が取れるようになったことだろう。どのテーブルから何行フェッチしたか、更新したか、挿入したか、削除したかが分かるようになった。それだけでなく、どのテーブル操作時にどれだけのI/O待ちやロック待ちが発生したかが分かるようになったので、チューニングすべきテーブルが特定しやすくなった。

さらにLabsでは、セッションごと、ユーザーごと、ステートメントごとの統計情報を収集するための仕組みを追加したプレビューバージョンが配布されている。こいつが正式版で利用可能になった暁には、ボトルネックになり得るクエリの特定もイッパツだ!

PERFORMANCE_SCHEMAがどれだけ凄いヤツなのかは、Mark Leith(MySQL Enterprise Monitor開発者)のブログエントリを見て貰うといいだろう。

OpenGIS

ジオメトリデータの比較において、これまではMBR(minimum bounding rectangle ≒ 近似的な長方形)に基づいた比較しか出来なかったのだが、ジオメトリの正確な形に基づいた比較ができるバージョンの関数が追加された。例えばMBRバージョンのContains()に対して、ST_Contains()というように、ST_というプレフィックスのついたものが正確な比較をするバージョンとなる。

まとめ

MySQLは着実に進化を遂げている!!

MySQL 5.6は、そう感じさせるのに十分なものとなっている。正直「こんなに大盤振る舞いして息切れしないか?」と心配になってしまうほどの機能強化であるが、きっとそんな心配は杞憂に終わるだろう。MySQL 5.6はマイルストーンリリースであり、次期正式版になるかどうかは現時点では不明である。(恐らくさらに次のいくつかのマイルストーンリリースでさらに機能が追加されるだろう。)だが、これからMySQLが目指すものがどういうものであるかということを測り知るには、最適な判断材料と言えるのではないだろうか。

とにもかくにもMySQL 5.6の新機能は目を見張るばかりである。次期マイルストーンリリース、そして次期正式版のリリースを心待ちにして頂きたい!

次回のエントリでは、同じくMySQL Conference & Expoにあわせてリリースされた、MySQL Cluster 7.2の新機能について解説しようと思う。

0 コメント:

コメントを投稿