1. ホーム
  2. データベース
  3. マイサク

mysqlのデータ圧縮性能比較 詳細

2022-01-06 13:29:47

Data Cubeでは、一度書き込んだら更新されることがほとんどないデータが必要です。このデータは、ディスクの占有面積を減らすための圧縮に最適で、MySQL 自身が 2 つの圧縮方法を提供しています -。 [root@hailiang linux-2.6.15.5]# cat /var/log/messages |tail    May 8 16:41:45 hailiang kernel: helloworld: version magic '2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS ' should be '2.6.27.5-117 .fc10.i686 SMP mod_unload 686 4KSTACKS ' エンジンと [root@hailiang tmp]# modinfo helloworld.ko filename: helloworld.ko alias: a simplest module description: A simple helloworld module author: zhanghailiang depends:        vermagic: 2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS   エンジンと #include <linux/module.h> #include <linux/vermagic.h> #include <linux/compiler.h> というメソッドがあります。今日は、この2つの方式をそれぞれテストして、ディスクフットプリントとクエリパフォーマンスの観点から、それぞれのメリットとデメリットを比較してみました。なぜこのようなことをしたのかについては、ご理解いただけたと思いますので、後ほど取り上げます。本文をご覧ください。

1.テスト環境

1.1 ソフトウェアとハードウェア

64ビット #include <linux/utsrelease.h> #include <linux/module.h> /* Simply sanity version stamp for modules. */ #ifdef CONFIG_SMP #define MODULE_VERMAGIC_SMP "SMP " #else #define MODULE_VERMAGIC_SMP "" #endif 。。。。。。。。。。。。。。。。。。。 #ifdef CONFIG_MODVERSIONS #define MODULE_VERMAGIC_MO DVERSIONS "modversions " #else #define MODULE_VERMAGIC_MODVERSIONS "" #endif #ifndef MODULE_ARCH_VERMAGIC #define MODULE_ARCH_VERMAGIC "" #endif #define VERMAGIC_STRING /         UTS_RELEASE " " /         MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT /         MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS /         MODULE_ARCH_VERMAGIC カーネル [root@hailiang 2.6.27.5-117.fc10.i686]# make menuconfig scripts/kconfig/mconf arch/x86/Kconfig # make menuconfig # configuration written to .config #   *** End of Linux kernel configuration. *** Execute 'make' to build the kernel or try 'make help'. [root@hailiang 2.6.27.5-117.fc10.i686]# make scripts/kconfig/conf -s arch/x86/Kconfig   CHK include/linux/version.h   CHK include/linux/utsrelease.h make[1]: *** No rule to make target `missing-syscalls'.  Stop. make: *** [prepare0] Error 2 開発機、4G RAM、4 2800Mhz Dual-Core AMD Opteron (tm) Processor 2220 CPUです。

7200rpmのSATドライブにMySQL、アンドゥーン raid そして

MySQLは最適化を行わず query cache を回避するために query cache がテスト結果に干渉しないようにする。

1.2 テーブル構造

2424753レコード、本番環境の特定のスライスの実際のデータです。

別途作成された( partition_by1,idx_rank ) と ( partition_by1,chg_idx ) であり、partition_by1 は検索用の32長のvarchar、残りの2フィールドは浮動小数点数であり、主にソートに使用される。

autokid の子インクリメントカラムとして動作します。 PRIMARY KEY であり、データロード時のアトミック性の保証としてのみ使用され、実質的な意味はない。

2. テスト目的

2.1 圧縮空間の比較

圧縮率が高ければ高いほど、ディスク容量が少なくなり、データの保存にかかるコストが直接的に削減されます。

2.2 クエリ性能の比較

圧縮後のクエリパフォーマンスに大きな劣化はないはずです。 Archive はインデックス作成をサポートしないので、性能低下は避けられませんし、どの程度の低下が許容範囲なのかも把握しておく必要があります。

3. テストツール

3.1 mysqlslap

公式ツールを使うのが確実です。について mysqlslap は、公式ドキュメントに記載されています。

3.2 クエリのテスト

本番アクセスを傍受する topranks_v3 実際のテーブルのSQLは全部で9973、その中からアクセス数の多い7項目を抽出し、同時50、10回繰り返す。コマンドは以下の通りです。

. /mysqlslap --defaults-file=... /etc/my.cnf -u**** -p**** -c50 -i10 -q . /t.sql --debug-info

4. テストの結論

<テーブル 比較項目 ディスクの空き容量 所要時間(秒) CPUアイドル LOAD コンカレント ベースライン・テーブル (MyISAM) 403956004 2.308 30 15 50 アーカイヴ 75630745 300 75 4 1 パック 99302109 2.596 30 22 50

上の表にあるテストデータに基づいて、単純に次のように結論づけることができます。

  • テストテーブルの場合は Archive テーブルが占めるスペースは、以前の 18.7% of the previous myisampack は以前の約24.6%のスペースを占めており、両者はほぼ同じで、純粋にスペースの利用率という点では archive テーブルを使用します。
  • もう一度、クエリの性能をベンチマークテーブルと比較して見ましょう。消費した総時間とシステム負荷の両方で、50個の同時実行可能な pack はベンチマークのテーブルと同等であるのに対し archive テーブルは、単一の同時実行ケースで5分以上かかります(もう待てない、殺せ)!

ということで、オンラインで問い合わせが必要なテーブルについては、結論として ARCHIVE エンジンは、オンラインでクエリを実行する必要があるテーブルについては、基本的に無視することができます。

なぜこのテストプロセス ARCHIVE のエンジンがとても遅いのですが?

ということが分かっています。 mysql が提供する archive このストレージエンジンは、ディスクのオーバーヘッドを減らすために設計されているが、アーカイブされるデータがオンラインでクエリされる必要がない、あるいはほとんどない、たまに遅いクエリがあってもいい、という注意書きがある。これらの理由から archive テーブルでは、セルフインクリメントカラム以外のインデックスを使用することはできません。

このようなコンセンサスを得た上で、テストSQLを作成し、インデックスを使用する前と使用した後のクエリパフォーマンスの差がなぜこれほどまでに大きいのかを分析してみましょう。

テストSQLの中に、次のような行があります。

SELECT c1,c2,... ,cn FROM mysqlslap.rpt_topranks_v3
WHERE ... AND partition_by1 = '50008090'
ORDER BY added_quantity3 DESC
LIMIT 500




先ほども言ったように、このテスト用のテーブルが partition_by1 フィールドにインデックスがあるため、最初の判断では、ベース・テーブルと myisampack テーブルを使用する場合、このクエリは partition_by1 のインデックスは EXPLAINは以下の通りです。

mysql> EXPLAIN
    -> SELECT ... FROM mysqlslap.rpt_topranks_v3
    -> WHERE ... AND partition_by1 = '50008090'
    -> ORDER BY added_quantity3 DESC
    -> LIMIT 500\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        TABLE: rpt_topranks_v3
         type: ref
possible_keys: idx_toprank_pid,idx_toprank_chg
          KEY: idx_toprank_pid
      key_len: 99
          ref: const
         rows: 2477
        Extra: USING WHERE; USING filesort
1 row IN SET (0.00 sec)



予想されるように、このクエリでは partition_by1 フィールドのターゲット行数 2477 にマッチし、さらに別のインデックスで added_quantity3 フィールドでソートします。そのため added_quantity3 はインデックスされないので filesort .

このSQLをアーカイブ・テーブルで実行したEXPLAINの結果をもう一度見てみましょう。

mysql> EXPLAIN
    -> SELECT ... FROM mysqlslap.rpt_topranks_v3_<strong>archive</strong>
    -> WHERE ... AND partition_by1 = '50008090'
    -> ORDER BY added_quantity3 DESC
    -> LIMIT 500\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        TABLE: rpt_topranks_v3_archive
         type: ALL
possible_keys: NULL
          KEY: NULL
      key_len: NULL
          ref: NULL
         rows: 2424753
        Extra: USING WHERE; USING filesort
1 row IN SET (0.00 sec)




EXPLAINによると、"。 インデックスが利用できないので、2424753行のテーブル全体をスキャンして filesort ." パフォーマンスを求めているわけで、それは明らかに委縮している MySQL を MySQL に転送する。

mysqlのデータ圧縮の性能比較についての記事は以上となります。mysqlデータ圧縮の性能比較については、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。