新たなクライアントが mysqld に接続すると、mysqld によって要求を処理する新規のスレッドが作成されます。このスレッドでは、まずホスト名がホスト名キャッシュにあるかどうかが確認されます。ない場合は、ホスト名の解決が試行されます。
スレッドは IP
アドレスをホスト名に解決します
(gethostbyaddr()
を使用)。次に、このホスト名を解決して IP
アドレスに戻し
(gethostbyname()
を使用)、元の IP
アドレスと比較して同一であることを確認します。
オペレーティングシステムがスレッドセーフの
gethostbyaddr_r()
と
gethostbyname_r()
の呼び出しをサポートしている場合、スレッドではこれを使用してホスト名の解決が実行されます。
オペレーティングシステムがスレッドセーフの呼び出しをサポートしていない場合、スレッドでは相互排他ロックを行い、代わりに
gethostbyaddr()
と
gethostbyname()
が呼び出される。この場合、ほかのスレッドでは最初のスレッドが相互排他ロックを解除するまで、ホスト名キャッシュ内にないホスト名を解決できなくなります。
mysqld を
--skip-name-resolve
オプションを指定して起動すると、DNS
ホスト名検索を無効化できます。ただし、この場合は、MySQL
権限テーブルで IP
番号しか使用できなくなります。
非常に低速の DNS
と多数のホストがある場合は、--skip-name-resolve
で
DNS
ルックアップを無効化するか、HOST_CACHE_SIZE
の定義 (デフォルト値: 128)
を拡張し、mysqld
を再コンパイルすることで、パフォーマンスを改善できます。
--skip-host-cache
オプションを使用してサーバーを起動すると、ホスト名キャッシュを無効化できます。ホスト名のキャッシュをクリアーするには、FLUSH
HOSTS
ステートメントを使用するか、mysqladmin
flush-hosts コマンドを実行します。
TCP/IP
接続すべてを認めない場合は、--skip-networking
オプションを指定して
mysqld を開始します。