mysqlのデータ圧縮性能比較 詳細
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データ圧縮の性能比較については、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。
関連
-
MySQL Innodb インデックスメカニズム詳細解説
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
MySQLにおけるorder byの使用方法の詳細
-
MySQLのWhereの使用方法について説明します。
-
SpringBootのMySQLへの接続は、バックエンドのインターフェイスの操作方法を書き込むためのデータを取得するために
-
MySQLで正規表現を使う 詳細
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
SQLException。オペランドは1列でなければなりません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
SQL集計、グループ化、ソート
-
MySQLのselect、distinct、limitの使い方
-
MySQLはこのようなUpdateステートメントを書くべきではありません
-
MySQLインデックスベースストレステストの実装
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
MySQLの悲観的ロックと楽観的ロックの実装スキーム
-
[解決済み】ValueError: 値の長さがインデックスの長さと一致しない|Pandas DataFrame.unique()
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'