以下のテストのほとんどは、MySQL ベンチマークを使用した Linux で実行されていますが、これ以外のオペレーティングシステムおよびワークロードに対しても一定の指針になります。
-static
とリンクした場合に最速のバイナリが得られます。
Linux 上では、pgccおよび
-O3
でコンパイルした場合に最速のコードが得られます。これらのオプションで
sql_yacc.cc
をコンパイルする場合は、gcc/pgccで関数のすべてをインラインにする際に大量のメモリが要求されるため約
200M のメモリが必要です。MySQL
のコンフィギャ時に CXX=gcc
も設定して、libstdc++
ライブラリ(これは不要です)が含まれないようにします。pgccの一部のバージョンでは、生成されたコードを
x586 タイプのプロセッサ(AMD
など)すべてで動作可能にするコンパイラオプションを使用しても、コードが純正
Pentium
プロセッサでしか実行できないため注意が必要です。
適切なコンパイラおよびコンパイラオプションを使用することで、アプリケーションの速度が 10–30% 改善されます。これは各自で SQL サーバをコンパイルする場合に特に重要です。
Cygnus CodeFusion と Fujitsu コンパイラの両方をテストしましたが、いずれもバグフリーではなく、最適化をオンにして MySQL をコンパイルするには不十分でした。
標準の MySQL
バイナリディストリビューションは、すべてのキャラクタセットをサポートするようにコンパイルされています。MySQL
のコンパイル時は、使用するキャラクタセットのサポートのみを含めます。
これは--with-charset
オプションからconfigureによって管理されます。
以下に実施した測定結果の一部を紹介します。
pgccを使用し、すべてを
-O6
でコンパイルした場合、mysqldサーバは
gcc2.95.2と比較して 1%
速度が上がる。
動的にリンクした場合(-static
なし)は、結果が
Linux 上で 13%
遅くなった。クライアントアプリケーションには動的リンクの
MySQL
ライブラリを使用できることに注意する。これは、サーバのパフォーマンス上重大である。
同一ホスト上で実行されるクライアントからサーバへの接続で、Unix
ソケットファイルではなく、TCP/IP
で接続すると、7.5%
パフォーマンスが遅くなった(Unixではlocalhost
に接続する場合、MySQL
ではデフォルトでソケットファイルが使用される)。
TCPクライアントからサーバへの TCP/IP 接続で別のホストにあるリモートサーバに接続した場合、100M イーサネットによる接続でも、同一ホスト上のローカルサーバに接続した場合と比較して、8–11% 遅くなった。
暗号化した接続(内部 SSL サポートによるすべてのデータの暗号化)を使用してベンチマークテストを実行した場合、パフォーマンスが 55% 遅くなった。
--with-debug=full
でコンパイルすると、ほとんどのクエリが
20% 遅くなる。
一部のクエリはかなり長くかかった(たとえば
MySQL ベンチマークは 35%
の速度低下)。--with-debug
(=full
なしで)を使用すると、この速度低下は
15%
で済む。--with-debug=full
でコンパイルされた
mysqldバージョンは、--skip-safemalloc
オプションで起動すると実行時のメモリチェックを無効化できる。この場合の最終的な結果は、--with-debug
で構成した場合に非常に近くなる。
Sun UltraSPARC-IIe, Forte 5.0 は、gcc3.2 より 4% 速度が上がった。
Sun UltraSPARC-IIe, Forte 5.0 では、64 ビットモードより 32 ビットモードのほうが 4% 速かった。
gcc2.95.2 for UltraSPARC
にオプション -mcpu=v8
-Wa,-xarch=v8plusa
を付けてコンパイルすると、パフォーマンスが
4% 改善した。
Solaris 2.5.1, MIT-pthreads は、単一プロセッサ上で Solaris ネイティブスレッドより 8–12% 遅かった。CPU の負荷が増加するとこの差はさらに拡大する。
フレームポインタ
-fomit-frame-pointer
または
-fomit-frame-pointer -ffixed-ebp
なしで
gccを使用して Linux-x86
でコンパイルすると、mysqldが
1–4% 速くなった。
pgccによるコンパイルに MySQL AB 提供の バイナリMySQL-Linux ディストリビューションを使用したが、AMD で実行されないコードを生成するバグが pgccにあったため、通常の gcc の使用に戻さざるを得ませんでした。このバグが解決されるまで gccの使用を続行します。 ただし、AMD 以外のコンピュータを使用する場合は、pgccでコンパイルすると高速なバイナリが得られます。標準の MySQL Linux バイナリは、速度および移植性を高めるため静的にリンクされています。