MySQL統計テーブルのサイズを説明する例

MySQL統計テーブルのサイズを説明する例

各データベース内の各テーブルのサイズをカウントすることは、データ ガバナンスの最も単純な要件の 1 つです。この記事では、サンプリング統計結果と正確な統計結果という 2 つの側面から、MySQL 内の各データベースとテーブルのデータ量をカウントします。

1. データ量の統計的推定

MySQL データ ディクショナリ ライブラリ information_schema には、推定データ量 (InnoDB エンジン テーブルの場合は不正確、MyISAM エンジン テーブルの場合は正確) と、データ サイズ、インデックス サイズ、テーブル フラグメント サイズなどの情報が記録されます。

各データベースとテーブルのおおよそのデータ量を知りたい場合は、information_schema.tables を直接クエリして統計情報を取得できます。例えば:

テーブルスキーマ、テーブル名、テーブル行、データ長+インデックス長+データ空き容量、データサイズを選択します。
 information_schema.`TABLES` から table_schema に ('db1','db2') を指定します。

data_sizeの単位はBです

前述のように、統計情報のデータ項目数とサイズは、一部のデータのサンプリング統計に基づいているため、実際のサイズと異なる場合があります。テーブルが大きいほど、違いは顕著になります。各テーブルの実際の状況を知りたい場合は、次の方法を使用する必要があります。

2. 実際のデータ量を数える

各テーブルの実際のサイズを数えたい場合は、各テーブルを走査してレコード数を計算する必要があります。テーブルスペースのサイズを確認することで、各テーブルのサイズを確認できます (各テーブルには独立したテーブルスペースがあります)。正確な統計の目的は、以下の手順に従うことで達成できます。

パスの作成

スクリプトや一時ファイルなどを保存するための作業ディレクトリを作成します。

mkdir -p /usr/local/データサイズ

統計データベースとテーブルを作成する

統計が必要なデータベース インスタンスに統計データベースを作成します。

SQL> データベース bak_db を作成します。

統計用のストアドプロシージャを作成する

SQL> bak_db を使用します。
SQL>プロシージャ `p_db_size`() を作成します
始める
v_id INT を宣言します。
v_maxid INT を宣言します。
v_tbname VARCHAR(50)を宣言します。
v_dbname VARCHAR(50) を宣言します。
v_sql_upd VARCHAR(200) を宣言します。
SET v_id =(SELECT MIN(id) FROM bak_db.tb_size);
SET v_maxid =(SELECT MAX(id) FROM bak_db.tb_size);
v_id <=v_maxid の場合
する
SET v_tbname = (SELECT tbname FROM bak_db.tb_size WHERE id=v_id);
SET v_dbname = (SELECT dbname FROM bak_db.tb_size WHERE id=v_id);
SET v_sql_upd = CONCAT('update bak_db.tb_size set tb_rows=(select count(*) from ',v_dbname,".",v_tbname,"") where id=",v_id);
  SET @v_sql_upd := v_sql_upd;
  @v_sql_upd からステートメントを準備します。
  ステートメントの実行;
  DEALLOCATE PREPARE ステートメント;
  v_id = v_id +1 を設定します。
終了しながら;
  終わり;

スクリプトの作成

vimデータ.sh
/* 次のコンテンツを挿入します */

#!/bin/bash
cd /usr/local/データサイズ
du -s /data/mysql/mysql3306/data/db1/* |grep -v ".frm" |grep -v ".opt" >/usr/local/data_size/data_size     
du -s /data/mysql/mysql3306/data/db2/* |grep -v ".frm" |grep -v ".opt">>/usr/local/data_size/data_size

# 次の4つのステップはSQLにスプライスすることです 
awk '{print "insert into bak_db.tb_size(size,tb_route)values("""$0}' /usr/local/data_size/data_size >/usr/local/data_size/data_size1  
awk '{print $0";"}' /usr/local/data_size/data_size1 >/usr/local/data_size/data_size.sql
sed -i "s#\t#,'#g" /usr/local/data_size/data_size.sql
sed -i "s#;#');#g" /usr/local/data_size/data_size.sql

# 統計テーブルを作成します /usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "drop table if exists bak_db.tb_size;CREATE TABLE IF NOT EXISTS bak_db.tb_size ( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT ,size INT,tb_route VARCHAR(200),tbname VARCHAR(50),dbname VARCHAR(50),tb_rows INT(11));" 

# データをインポート /usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "use bak_db;truncate table bak_db.tb_size;source /usr/local/data_size/data_size.sql;"

# ライブラリ名とテーブル名を生成します。もちろん、この手順はデータ フィールドから取得することもできます。 /usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "use bak_db;UPDATE bak_db.tb_size SET tbname=REPLACE(SUBSTRING_INDEX(tb_route,'/',-1),'.ibd','');"
 /usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "UPDATE bak_db.tb_size SET dbname=LEFT (SUBSTRING_INDEX(tb_route,'/',-2),INSTR(SUBSTRING_INDEX(tb_route,'/',-2),'/')-1);"
sleep 10 # 前の手順がマスターデータベースにある場合は、後で統計を実行するときにテーブルとコンテンツの取得に失敗しないように、しばらく一時停止することをお勧めします。前の手順がスレーブデータベースにある場合は、この手順は省略できます echo 'start call procedure' 
# ストアド プロシージャを呼び出して、各テーブルのレコード数をカウントします /usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "use bak_db;call bak_db.p_db_size();"

# テーブルとデータをエクスポートします /usr/local/mysql5.7/bin/mysqldump -uroot -p'Test#123456' -h 192.168.28.132 --single-transaction bak_db tb_size >/usr/local/data_size/tb_size.sql

# テーブルと結果をマスター データベースにインポートします (スレーブ データベースは、一度削除して再構築するのと同じです)
/usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.128 -e "use bak_db;source /usr/local/data_size/tb_size.sql;"

結果は次のとおりです。

正確な値は統計情報の値とは大きく異なっており、表が大きくなるほどその違いは明らかであることがわかります。

ヒント: この記事の正確な統計スクリプトには、最適化の余地がまだたくさんあります。急いで書いたものです。必要に応じて調整してください。私のレベルには限界があるので、遠慮なく訂正してください。ご質問がございましたら、お気軽にご連絡ください。

上記は、MySQL 統計ライブラリ テーブル サイズの詳細を説明する例です。MySQL 統計ライブラリ テーブル サイズの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL統計の概要
  • 各Mysqlテーブルの行数を正確にカウントする小さなシェルスクリプト
  • MySQLは複数テーブル関連統計(サブクエリ統計)の例を実装します
  • PythonはMySQLデータ統計とNumPy統計関数を実装します
  • 日、時間、分ごとの連続期間データの sqlserver/mysql 統計 [推奨]
  • 一定期間の日ごと、時間ごとの統計データを取得するMySQLの詳しい説明
  • PHP+MySQL で一定期間内に毎日のデータ統計の最適化操作例を実現
  • PHP 広告クリック統計コード (php+mysql)
  • MySQL 8.0 の統計が不正確である理由

<<:  Reactの状態の理解についての簡単な分析

>>:  Dockerを使用してDjango+MySQL8開発環境をデプロイする方法の詳細な説明

推薦する

jQuery における Ajax の関連知識ポイントのまとめ

序文JavaScriptを学ぶ学生は、 AJAX (非同期JavaScriptとxml) 変換は非同...

Docker を使用した war パッケージ プロジェクトのデプロイの実装

Docker で war をデプロイするには、コンテナを使用する必要があります。ここでは tomca...

Reactでコンポーネントがどのように通信するかの詳細な説明

1. 何ですかコンポーネント間の通信は、次の 2 つの単語に分けることができます。コンポーネントコ...

jQueryで劇場の座席選択と予約の効果を実現

jQueryは劇場の座席選択と予約の効果を実現します。参考までに、具体的な内容は次のとおりです。効果...

Ansible を使用した Nginx のバッチ デプロイのサンプル コード

1.1 nginxインストールパッケージとインストールスクリプトをクライアントにコピーし、スクリプト...

高同時実行シナリオにおける nginx 最適化の詳細な説明

日常の運用・保守作業では、nginx サービスが頻繁に使用され、nginx の高同時実行性によって生...

IE8でラベルの背景画像が表示されない問題の解決方法

今日、ちょっとした問題に遭遇し、長い間苦労しました。そのことを皆さんにシェアしたいと思います。 a ...

星のきらめき効果を実現するネイティブ js

この記事の例では、星のきらめき効果を実現するためのjsの具体的なコードを共有しています。具体的な内容...

MySQL オンライン DDL ツール gh-ost 原理分析

目次1. はじめに1.1 原則1.2 プロセス1.3 特徴1.4 githubアドレス2. テスト環...

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明以下は私が作成した M...

Nginx のステータス監視とログ分析の詳細な説明

1. Nginx ステータス監視Nginx には、Nginx の全体的なアクセス ステータスを監視す...

Vue双方向バインディングの詳細な説明

目次1. 双方向バインディング2. 他のタグを選択した場合にも同じ結果になりますか? 答えはもちろん...

MySQL トランザクション分離はどのように実現されますか?

目次同時シナリオ書き込む読む読む読み取り-書き込みと書き込み-読み取りMySQL のロック行レベルロ...

Vue はネストされたルーティングメソッドの例を実装します

1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...

シンプルなドラッグ効果を実現するjs

この記事では、簡単なドラッグ効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な...