Understanding MySQL Internalsを読む(8)

連載記事一覧は*こちら*にあります。

http://mirz.jpでまとめて読むこともできます(オススメ)。

プリプロセッサマクロ

MySQLソースコードC言語プリプロセッサマクロを多用しています。

以下はMySQLで良く利用されているプリプロセッサマクロです。

マクロ 定義ファイル 説明
sint2korr(A) include/global.h 引数Aを下位バイトから順に処理して符号付きの2バイト整数として返す。リトルエンディアンを採用しているアーキテクチャではこのマクロは単なるポインタの逆参照に過ぎない。しかしながら、ビッグエンディアンアーキテクチャでは、正しい値を返すためには計算を行わなければならない。
sint3korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号付きの3バイト整数として返す。
sint4korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号付きの4バイト整数として返す。
sint5korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号付きの5バイト整数として返す。
sint8korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号付きの8バイト整数として返す。
uint2korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号無しの2バイト整数(正の整数)として返す。
uint3korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号無しの3バイト整数(正の整数)として返す。
uint4korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号無しの4バイト整数(正の整数)として返す。
uint5korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号無しの5バイト整数(正の整数)として返す。
uint8korr(A) include/my_global.h 引数Aを下位バイトから順に処理して符号無しの8バイト整数(正の整数)として返す。
int2store(T, A) include/my_global.h 引数Aの値を引数Tから始まる2バイトの場所に、マシンのバイトオーダーに関係なく下位バイトから順に格納する。
int3store(T, A) include/my_global.h 引数Aの値を引数Tから始まる3バイトの場所に、マシンのバイトオーダーに関係なく下位バイトから順に格納する。
int4store(T, A) include/my_global.h 引数Aの値を引数Tから始まる4バイトの場所に、マシンのバイトオーダーに関係なく下位バイトから順に格納する。
int5store(T, A) include/my_global.h 引数Aの値を引数Tから始まる5バイトの場所に、マシンのバイトオーダーに関係なく下位バイトから順に格納する。
int8store(T, A) include/my_global.h 引数Aの値を引数Tから始まる8バイトの場所に、マシンのバイトオーダーに関係なく下位バイトから順に格納する。
LINT_INIT(var) include/my_global.h MySQLソースコード中で使用されている変数の中には通常初期化されないものがある。いくつかのプログラミング用ツールはこうした変数を見つけるとエラーを返す。その場合、全ての変数を明示的に初期化させることでCPUを無駄にすることの代わりに、このマクロを使うことでそのようなツールが検知した場合に変数を初期化する。あるいはFORCE_INIT_OF_VARSが定義されている場合に、変数を初期化する。
swap_variables(t, a, b) include/my_global.h 引数tで指定された型の引数a,bの値を交換する。
set_if_bigger(a, b) include/my_global.h もし引数bの値が引数aよりも大きければ、aの値をbに設定する。
set_if_smaller(a, b) include/my_global.h もし引数bの値が引数aよりも小さければ、aの値をbに設定する。
test_all_bits(a, b) include/my_global.h もし引数aのビットが全て引数bでも立っていたら、0以外の値を返す。
array_elements(A) include/my_global.h 引数で指定された配列Aの要素数を返す。
current_thd sql/mysql_priv.h 現在のスレッドに関連付けられたTHDオブジェクトを返す。
IF_WIN(A, B) sql/mysql_priv.h WindowsまたはOS/2の場合にはA、それ以外の場合にはBとしてマクロを展開する。
PREV_BITS(type, A) sql/mysql_priv.h 引数typeで指定された型に対する、下位Aビット用のビットマスクを返す。

意外とあっさり終了。

グローバル変数

MySQLでよく使用されているグローバル変数MySQL 5.0ではステータス変数のスコープにSESSION/GLOBALが導入され、それまでグローバル変数として実装されてきたステータス変数のうちの多くがsystem_status_var構造体へと移管されていることに注意。

変数定義 定義ファイル 説明
char *mysql_data_home sql/mysqld.cc データディレクトリのパスへのポインタ。設定ファイル/起動引数のdatadirで指定されたもの。
char server_version[SERVER_VERSION_LENGTH] sql/mysqld.cc mysqlクライアントによる接続時の挨拶メッセージ、ログファイル等で出力されるMySQLのバージョン文字列。例えば"mysql-4.1.5-log"など。
char mysql_charsets_dir[FN_REFLEN] sql/mysqld.cc 文字コード定義ファイル一式を持っているディレクトリのパスへのポインタ。設定ファイル/起動引数のcharacter-set-dirで指定されたもの。
ulong refresh_version sql/mysqld.cc データベース管理者がFLUSH TABLESコマンドを発行する度に増加される変数。既にオープンしているテーブルがある場合、リロードすべきかどうかをtable->refresh_version変数とグローバルなrefresh_version変数との比較によって判定している。
ulong thread_id sql/mysqld.cc 新しく生成されたスレッドに対して割り当てるIDをユニークにするために使用される変数。新しいスレッドが生成されると、現在のthread_idの値が割り当てられ、thread_idが1つカウントアップされる。
ulong query_id sql/mysqld.cc 新しいSQL文処理要求に対して割り当てるIDをユニークにするために使用される変数。新しいSQL文処理要求を受けると、現在のquery_idの値が割り当てられ、query_idが1つカウントアップされる。
ulong opened_tables sql/mysqld.cc mysqldサーバが起動して以来、何回テーブルがオープンされたのかを記録しているカウンタ。SHOW STATUSコマンド実行時にOpened_tables変数でこの値を確認することができる。尚、現在オープン中のテーブルの数はOpen_tablesなので間違えの無いように。
ulong created_tmp_tables sql/mysqld.cc mysqldサーバが起動して以来、何回一時テーブルが作成されたのかを記録しているカウンタ。SHOW STATUSコマンド実行時にCreated_tmp_tables変数でこの値を確認することができる。
ulong created_tmp_disk_tables sql/mysqld.cc MySQLは可能であれば一時テーブルをメモリ上に作成して使用する。しかしながら、一時テーブルの大きさやMEMORYストレージエンジンの制限によりメモリ上では処理できない場合がある。その時、一時テーブルはディスク上に作成され、このカウンタが1つ増加される。SHOW STATUSコマンド実行時にCreated_tmp_disk_tables変数でこの値を確認することができる。
ulong aborted_threads sql/mysqld.cc 正常に接続できた後、異常が発生して終了してしまった接続の数を記録している変数。SHOW STATUSコマンド実行時にAborted_clients変数でこの値を確認することができる。
ulong aborted_connects sql/mysqld.cc 認証に失敗してしまった接続の数を記録している変数。SHOW STATUSコマンド実行時にAborted_connects変数でこの値を確認することができる。
ulong query_cache_size sql/mysqld.cc クエリキャッシュのサイズ。設定ファイル/起動引数のquery-cache-sizeで指定されたもの。
ulong server_id sql/mysqld.cc レプリケーション構成に参加するmysqldサーバにはユニークなIDを設定して置かなければならない。この変数はこのmysqldサーバのIDが格納されている。設定ファイル/起動引数のserver-idで指定されたもの。
ulong max_connections sql/mysqld.cc mysqldサーバへの同時接続可能な最大数。設定ファイル/起動引数のmax-connectionsで指定されたもの。
ulong long_query_count sql/mysqld.cc オプティマイザによって遅いと見なされたクエリのカウンタ。SHOW STATUSのSlow_queries変数で確認できる。
ulong what_to_log sql/mysqld.cc ログファイルに出力すべきSQLコマンドのビットマスク。この変数はサーバ内部でのみ使用され、ユーザが設定することはできない。
ulong com_stat[(uint) SQLCOM_END] sql/mysqld.cc SQLコマンドのためのカウンタの配列。SHOW STATUS LIKE 'Com_%'でそれぞれの値を確認できる。
bool abort_loop sql/mysqld.cc シャットダウン処理中に設定されるフラグ。ループ実行を行っているコード上でループから抜けるように伝達するために使用される。
boot shutdown_in_progress sql/mysqld.cc シャットダウン中に設定されるフラグ。シャットダウン処理を重複実行しないようにするために使用される。
uint thread_count sql/mysqld.cc 現在mysqldサーバに存在しているスレッドの数。SHOW STATUSコマンド実行時にThreads_connected変数で確認できる。
uint thread_running sql/mysqld.cc 現在リクエストを処理中のスレッドの数。mysqldサーバには処理中のスレッドと次の処理要求を待っているスレッドがあることに注意。SHOW STATUSコマンド実行時にThreads_running変数で確認できる。
MYSQL_LOG mysql_log sql/log.cc 一般クエリログ用のログオブジェクト。
MYSQL_LOG mysql_bin_log sql/log.cc バイナリログ用のログオブジェクト。
MYSQL_LOG mysql_slow_log sql/log.cc スロークエリログ用のログオブジェクト。
pthread_mutex_t LOCK_open sql/mysqld.cc 排他制御を必要とするテーブル操作やテーブルのオープン、テーブルキャッシュの操作を行う際に使用するためのロック変数。
pthread_mutex_t LOCK_thread_count sql/mysqld.cc スレッドの生成、削除を行う際に使用するためのロック変数。
pthread_mutex_t LOCK_status sql/mysqld.cc SHOW STATUSで表示する対象となっているステータス変数を読んだり修正したりする際に使用するロック変数。
pthread_cont_t COND_refresh sql/mysqld.cc テーブルの状態が変化したことを待機中のスレッドに伝達するために使用されるPOSIXスレッドの条件変数。
pthread_cond_t COND_thread_count sql/mysqld.cc 新しいスレッドが生成された、あるいは古いスレッドが破壊されたことを待機中のスレッドに伝達するために使用されるPOSIXスレッドの条件変数。
I_List threads sql/mysqld.cc 現在のmysqldサーバに存在するスレッドの一覧。SHOW PROCESSLISTコマンドで閲覧可能。SHOW FULL PROCESSLISTコマンドでさらに詳しい情報を閲覧可能。
I_List key_caches sql/mysqld.cc mysqldサーバに存在するMyISAM用key cacheの一覧。MySQL 4.1からMyISAMは複数のkey cacheを利用できるようになっている。
struct system_variables global_system_variables sql/mysqld.cc システム変数一式。設定ファイル/起動オプション/SETコマンド等で変更が可能。
struct system_variables max_system_variables sql/mysqld.cc システム変数の制限値の一式。
HASH open_cache sql/sql_base.cc テーブルキャッシュ。テーブルがオープンされた時、テーブル記述子がテーブルキャッシュに格納される。同じテーブルをオープンしようとする後続のリクエストはこのキャッシュを利用できる。テーブルキャッシュの中身はSHOW OPEN TABLESコマンドで確認が可能。
uint protocol_version sql/mysqld.cc mysql client/serverプロトコルのバージョンを格納する変数。
uint mysqld_port sql/mysqld.cc mysqldサーバがlistenしているTCP/IPのポート番号。
struct my_option my_long_options[] sql/mysqld.cc サーバが解釈可能な全てのシステム変数の記述子。