ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

「MariaDB&MySQL全機能バイブル」を読んでMySQLの基本をおさらい

はじめに

読みました。

MariaDB&MySQL全機能バイブル

MariaDB&MySQL全機能バイブル

日本語でMariaDBが書籍になってるのはこれぐらいじゃないでしょうか。

仕事でMariaDBに関する案件を担当しています。それまでもmysql -uでログインしてSELECT叩くぐらいはしてきたのですが、そもそもこういうオープンソースのRDMSの仕組みをまったく知らないので、語彙がありません。

まずどういう仕組みでデータベースが成り立っているのか、そしてMySQLからフォークしたMariaDBとの違い、その他の機能について、おおまかな把握と語彙獲得のために読みました。

本書のchapter06のSQL文と、Chapter07のデータ型、演算子と関数はリファレンス的に使おうと思って読んでいません。(語彙を増やすためならさらっとでも目を通したほうがいいのですが、今回はスルー。)

Chapter1 イントロダクション

MySQLMariaDBの歴史について記載されています。MySQLの生みの親、Michael "Monty" Widenius氏がSUNを退職し、Monty Program AB社を設立、MariaDBの開発をはじめたとのこと。

MariaDBSQLレベルでほぼ完全な互換性を持っているので、MySQLからMariaDBへの切り替えに特別な作業は不要。

どうでもいいですがwikipedia mariadbで検索するとwikipediaのDBがmariadbであることがわかりました。(笑)

news.mynavi.jp

機能

主要機能について復習。

Thread PoolがMariaDBはあり、MySQLは商用のみってのが目立った違いか。

ストレージエンジン

たくさんサポートしていますが、InnoDBMyISAMだけ覚えておけばよさそう。なおMariaDBのデフォルトストレージエンジンはInnoDBです。(5.5まではXtraDBだったが、10.0からはInnoDB)

MariaDBMySQLの違い

SQLはほぼ互換あり、微妙に差異があるものもあるが、今回はスルー。

プロトコルも共通なので、特に問題なくお互いを変更することができそうだ。

機能面は先ほどあげたThread Pool。あとはバイナリログのバージョン、MariaDBはv1のみ、MySQLはv1とv2。

Chapter2 MariaDB/MySQLの内部構造

mysqldサーバの本体はmysqldというデーモンプロセスです。mysqlクライアントから接続要求を受けると内部にスレッドを生成し、そのスレッドがクライアントのSQL文を処理します。

さてこのスレッド生成ですが、スレッドキャッシュというキャッシュが用意されており、キャッシュ内にスレッドがあればここから使い、なければ新規生成することになります。

特殊なスレッド

clientからの接続ごとに生成されるスレッド以外に、ある処理を専門に行う特殊なスレッドがあります。

I/Oスレッド

InnoDBのため、複数のI/Oスレッド、加えてinnodb_thread_currencyで指定した数のスレッドが起動。その名の通りDBへの書き込みを行うスレッド。

Purgeスレッド

UNDOログを削除するスレッド。

Pager_cleanerスレッド

buffer poolのdirty pageを書き出すスレッド。

メモリ構造

実際のデータベースファイルに書き込む前に、様々なメモリ領域に事前に書き込む。

問い合わせ処理のときのバッファ

  • key_buffer: MyISAMテーブルの場合、インデックスデータを読み込んでスキャンするためのバッファ。
  • read_buffer: インデックスが参照しているテーブルデータを読み込んでスキャンするためのバッファ
  • sort_buffer: ORDER_BY処理など、結果の並べ替えに使うバッファ
  • join_buffer: テーブルの完全結合を行うバッファ

キャッシュ

  • テーブルキャッシュ
  • ネットバッファ: クライアントから受信するSQL文やクライアントに送信するデータの一時保存場所
  • クエリキャッシュ: 実行されたSELECT文の結果を保存しておく
  • スレッドキャッシュ: クライアントから接続されるためのスレッドのキャッシュ

InnoDBのデータ構造

実際のデータファイルであるibdata1の中には、 * データディクショナリ... メタデータ * ダブルライトバッファ... データ頑強性のため * ロールバックセグメント...トランザクションロールバックのため * UNDOログ...トランザクションロールバックのため * インデックス...インデックス * テーブルデータ...テーブルデー

が含まれています。

また、トランザクションログ(REDOログ)はib_logfile0とib_logfile1です。

InnoDBのWAL戦略

データの変更はトランザクションログ(REDOログ、すなわちib_logfile1/2)に書き込み、て0ブルデータファイルを直接操作することは極力避ける

書き込む順は

  1. log_buffer(メモリ)
  2. buffer_pool(メモリ)
  3. ib_logfile(ファイル)
  4. ibdata(ファイル)

ログバッファの中身をトランザクションログに書き込むタイミングは、innodb_flash_log_at_trx_commit変数の値によって3パターンにわかれる。

そしてbuffer poolをibdataに書き込むタイミングはチェックポイントごと。一定周期で一気に書き込むらしい。

chapter3 インストール

省略!

chapter4 MariaDB/MySQLサーバ管理

システム変数全部見ていくわけにもいかないのと、レプリケーション、ログ、ダンプ/リストア、文字コードなど内容盛りだくさんで、詳しいです。

chapter5 対話型インタフェースmysqlの使い方

対話型インターフェイスの基本的な使い方。多くの方は習得してるでしょう。

chapter6 SQL

今回の仕事ではクエリをいじるわけでないので読み飛ばし。

chapter7 データ型、演算子と関数

同じく読み飛ばし

おわりに

内容はかなり詳しいですし、リファレンスとして使えるだけでなく、深い構造の理解も可能になっています。何か困った時関連の章をしっかり読み込み復習する、という使い方もできそうです。

とはいえ、これをMySQL/MariaDBの最初の1冊として読むのは結構厳しいと思います。(そうして後悔。。。)

せめてデータベース一般の用語を押さえてからですね。(WALとか、レプリケーションとか。)

とはいえ、MariaDB唯一の書籍なんだよなぁ。10系で本でないかなー。10.2とか10.3サポートで。