Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
約5年前投稿

CharsetとCollationの設定がMySQLのパフォーマンスに与える影響

CharsetとCollationの設定がMySQLのパフォーマンスに与える影響

原文
Charset and Collation Settings Impact on MySQL Performance - Percona Database Performance Blog (English)
原文公開日
2019-02-27
翻訳依頼者
D98ee74ffe0fafbdc83b23907dda3665 907f339337a8fe2a4d4c498d1545231b 6412e654341795154dba99d0afd53d64
翻訳者
B99a01b46495d2ac4d1eb2c963add67e mita2
翻訳レビュアー
B5aa4f809000b9147289650532e83932 taka-h
原著者への翻訳報告
1836日前 原文へのコメントで報告済み 編集


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は比較に大きな影響を与える

次の記事
私のモノリスを返して
前の記事
多分あなたにKubernetesは必要ない

Feed small 記事フィード

新着記事Twitterアカウント