次のテストのほとんどは、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/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-pthread は、単一プロセッサ上で Solaris ネイティブスレッドより 8 - 12% 遅かった。CPU の負荷が増加するとこの差はさらに拡大する。
フレームポインタ
-fomit-frame-pointer
または
-fomit-frame-pointer -ffixed-ebp
なしで
gcc を使用して
Linux-x86
でコンパイルすると、mysqld
が 1 - 4% 速くなった。
当社提供の Linux 版 MySQL バイナリ配布は以前は pgcc でコンパイルされていましたが、AMD で実行できないコードを生成するバグが pgcc にあったため、通常の gcc の使用に戻る必要がありました。このバグが解決されるまで gcc の使用を続行します。ただし、AMD 以外のコンピュータを使用する場合は、pgcc でコンパイルすると高速なバイナリが得られます。標準の MySQL Linux バイナリは、速度および移植性を高めるため静的にリンクされています。