MySQL 8 は MySQL 5.7 より常に高速とは限らない(MySQL 8 is not always faster than MySQL 5.7) に続いて、 今回は、データがメモリに収まっており、CPUバウンドな、read only のとてもシンプルなワークロードのテストをすると決めました。このワークロードにIO処理はありません、メモリとCPUの処理だけです。
テスト環境
環境のスペック
- Release | Ubuntu 18.04 LTS (bionic)
- Kernel | 4.15.0-20-generic
- Processors | physical = 2, cores = 28, virtual = 56, hyperthreading = yes
- Models | 56xIntel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz<
- Memory Total | 376.6G
- Provider | packet.net x2.xlarge.x86 instance
oltp_read_only と oltp_point_select の2つのsysbenchのワークロードをさまざまなスレッド数でテストします。
sysbench oltp_read_only --mysql-ssl=off --report-interval=1 --time=300 --threads=$i --tables=10 --table-size=10000000 --mysql-user=root run
sysbench oltp_point_select --mysql-ssl=off --report-interval=1 --time=300 --threads=$i --tables=10 --table-size=10000000 --mysql-user=root run
OLTP read-only (latin1 character set) の結果:
MySQL 5.7.25 | MySQL 8.0.15 | ||
---|---|---|---|
threads | throughput | throughput | throughput ratio |
1 | 1241.18 | 1114.4 | 1.11 |
4 | 4578.18 | 4106.69 | 1.11 |
16 | 15763.64 | 14303.54 | 1.10 |
24 | 21384.57 | 19472.89 | 1.10 |
32 | 25081.17 | 22897.04 | 1.10 |
48 | 32363.27 | 29600.26 | 1.09 |
64 | 39629.09 | 35585.88 | 1.11 |
128 | 38448.23 | 34718.42 | 1.11 |
256 | 36306.44 | 32798.12 | 1.11 |
point_select (latin1 character set) の結果:
point select | MySQL 5.7.25 | MySQL 8.0.15 | |
---|---|---|---|
threads | throughput | throughput | throughput ratio |
1 | 31672.52 | 28344.25 | 1.12 |
4 | 110650.7 | 98296.46 | 1.13 |
16 | 390165.41 | 347026.49 | 1.12 |
24 | 534454.55 | 474024.56 | 1.13 |
32 | 620402.74 | 554524.73 | 1.12 |
48 | 806367.3 | 718350.87 | 1.12 |
64 | 1120586.03 | 972366.59 | 1.15 |
128 | 1108638.47 | 960015.17 | 1.15 |
256 | 1038166.63 | 891470.11 | 1.16 |
OLTP read-only ワークロードにおいて MySQL 8.0.15 は10%遅く、point_select ワークロードではMySQL 8.0.15 は12-16% 遅いことがわかります。 この差は必ずしも重要でないとしても、この結果は私がテストした様々なワークロードでは、MySQL 8.0.15 が MySQL 5.7.25 ほどパフォーマンスが良くないことが、十分に明らかです。
しかしながら、latin1ではなくutf8mb4となると結果は変わってくるようです。
MySQL 5.7.25 の latin1 と utf8mb4 を比較してみましょう。utf8mb4 は、MySQL 8.0のデフォルトのcharsetです。
さて、その前にcollationについても確認しておきましょう。
MySQL 5.7.25 は uft8mb4_general_ci をデフォルトのcollationとして使います。 しかし、東欧の言語を正しくソート・比較するためには、utf8mb4_unicode_ci を利用したほうが良いかもしれません。
MySQL 8.0.5 のデフォルトのcollationは utf8mb4_0900_ai_ci です(訳注:原文では途切れてますが文脈から補完)。
では、それぞれのバージョンで (デフォルトのcollationで)latin1 と utf8mb4 で比較してみましょう
まず、5.7です。
Threads | utf8mb4_general_ci | latin1 | latin1 ratio |
---|---|---|---|
4 | 2957.99 | 4578.18 | 1.55 |
24 | 13792.55 | 21384.57 | 1.55 |
64 | 24516.99 | 39629.09 | 1.62 |
128 | 23977.07 | 38448.23 | 1.60 |
MySQL 5.7 では utf8mb4 は latin1 よりずっと遅いことがわかります(55-60%)。
次はMySQL8.0.15です。
Threads | utf8mb4_0900_ai_ci (default) | latin1 | latin1 ratio |
---|---|---|---|
4 | 3968.88 | 4106.69 | 1.03 |
24 | 18446.19 | 19472.89 | 1.06 |
64 | 32776.35 | 35585.88 | 1.09 |
128 | 31301.75 | 34718.42 | 1.11 |
MySQL 8.0 では、utf8mb4の影響はより低くなっています(最大で11%)。
それでは、utf8mb4の全てのcollationを比較してみましょう。
MySQL 5.7
utf8mb4_general_ci (default) | utf8mb4_bin | utf8mb4_unicode_ci | utf8mb4_unicode_520_ci | |
---|---|---|---|---|
4 | 2957.99 | 3328.8 | 2157.61 | 1942.78 |
24 | 13792.55 | 15857.29 | 9989.96 | 9095.17 |
64 | 24516.99 | 28125.16 | 16207.26 | 14768.64 |
128 | 23977.07 | 27410.94 | 15970.6 | 14560.6 |
もし、utf8mb4_unicode_ci を使うのであれば、(utf8mb4_general_ci と比較して) より大きなパフォーマンス影響を受けるでしょう。
MySQL 8.0.15
utf8mb4_general_ci | utf8mb4_bin | utf8mb4_unicode_ci | utf8mb4_0900_ai_ci (default) | |
---|---|---|---|---|
4 | 3461.8 | 3628.01 | 3363.7 | 3968.88 |
24 | 16327.45 | 17136.16 | 15740.83 | 18446.19 |
64 | 28960.62 | 30390.29 | 27242.72 | 32776.35 |
128 | 27967.25 | 29256.89 | 26489.83 | 31301.75 |
では、 MySQ 8.0 と MySQL 5.7を utf8mb4 / デフォルト collation で比較してみましょう。
MySQL 8.0 utf8mb4_0900_ai_ci | MySQL 5.7 utf8mb4_general_ci | MySQL 8.0 ratio | |
---|---|---|---|
4 | 3968.88 | 2957.99 | 1.34 |
24 | 18446.19 | 13792.55 | 1.34 |
64 | 32776.35 | 24516.99 | 1.34 |
128 | 31301.75 | 23977.07 | 1.31 |
どうでしょう。このケースでは、MySQL 8.0 は MySQL 5.7より実に34%も優れています。
結論
もたらされた所見:
- latin1 では MySQL 5.7 は MySQL 8.0 より高性能
- utf8mb4 では MySQL 8.0 は MySQL 5.7 より非常に高性能
- MySQL 8.0 では utf8mb4 がデフォルトで、一方、MySQL 5.7 では latin1 がデフォルトであることに注意
- MySQL 8.0 と MySQL 5.7 の比較を行うとき、どのcharsetを利用するか注意、charsetは比較に大きな影響を与える