web-dev-qa-db-ja.com

MySQLにINFORMATION_SCHEMAはどのように実装されますか?

INFORMATION_SCHEMAは、理論的には、ユーザーがシステムのメタデータを検査できるようにするSQL標準で指定されたビューのセットです。これはどのようにMySQLに実装されますか?

新規インストールに接続すると、mysqlinformation_schemaの2つのデータベースが表示されます。 SHOW CREATE TABLEデータベースでinformation_schemaステートメントを使用すると、ビューのセットとして実装されているのではなく、ベーステーブルが実装されているように見えます。この仮定は正しいですか?または、ユーザーから非表示になっている他のシステムテーブルがありますか?

14
ivotron

INFORMATION_SCHEMA データベースは、MEMORYストレージエンジンを使用する一時テーブルで構成されています。

例:これは、MySQL 5.5.12(Windowsバージョン)のINFORMATION_SCHEMA.TABLESテーブルです。

mysql> show create table information_schema.tables\G
*************************** 1. row ***************************
       Table: TABLES
Create Table: CREATE TEMPORARY TABLE `TABLES` (
  `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
  `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  `TABLE_TYPE` varchar(64) NOT NULL DEFAULT '',
  `ENGINE` varchar(64) DEFAULT NULL,
  `VERSION` bigint(21) unsigned DEFAULT NULL,
  `ROW_FORMAT` varchar(10) DEFAULT NULL,
  `TABLE_ROWS` bigint(21) unsigned DEFAULT NULL,
  `AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `DATA_FREE` bigint(21) unsigned DEFAULT NULL,
  `AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL,
  `CREATE_TIME` datetime DEFAULT NULL,
  `UPDATE_TIME` datetime DEFAULT NULL,
  `CHECK_TIME` datetime DEFAULT NULL,
  `TABLE_COLLATION` varchar(32) DEFAULT NULL,
  `CHECKSUM` bigint(21) unsigned DEFAULT NULL,
  `CREATE_OPTIONS` varchar(255) DEFAULT NULL,
  `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

これらのテーブル用の物理フォルダはなく、.frmファイルもありません。それをmysqldumpすることはできません。落とせません。テーブルを追加することはできません。そこからテーブルを削除することはできません。それで、テーブルはどこですか???

INFORMATION_SCHEMAデータベース内のすべてのテーブルは、MEMORYストレージエンジンテーブルとしてメモリに直接格納されます。これらは完全にMySQLの内部にあるため、.frmメカニズムはmysqldで処理されます。私の回答では、最初にINFORMATION_SCHEMA.TABLESのテーブルレイアウトを示しました。これはメモリ内の一時テーブルです。ストレージエンジンプロトコルを使用して操作されます。したがって、mysqldがシャットダウンされると、すべてのinformation_schemaテーブルが削除されます。 mysqldが開始されると、すべてのinformation_schemaテーブルがTEMPORARYテーブルとして作成され、mysqlインスタンス内のすべてのテーブルのメタデータが再投入されます。

INFORMATION_SCHEMA データベースは、他のストレージエンジンのテーブルに関するメタデータにアクセスできるようにするために、MySQL 5.0で初めて導入されました。たとえば、 SHOW DATABASES を実行して、データベースのリストを取得できます。次のようにクエリすることもできます。

SELECT schema_name database FROM information_schema.schemata;

次の2つの方法で、データベースのテーブル名を取得できます。

use mydb
show tables;

または

SELECT table_name from information_schema.tables WHERE table_schema = 'mydb';

MySQLは誕生以来、INFORMATION_SCHEMAデータベースを拡張してプロセスリストを作成しています(MySQL 5.1以降)。実際にプロセスリストを照会して、少なくとも10分間実行されている実行時間の長いクエリを探すことができます。

SELECT * FROM information_schema.processlist WHERE time >= 600\G

INFORMATION_SCHEMAを使用して、次のようなすべての手の込んだことを行うことができます。

特定のストレージエンジンを使用してすべてのテーブルの数を取得します。

SELECT COUNT(1) TableCount,IFNULL(engine,'Total') StorageEngine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND engine IS NOT NULL
GROUP BY engine WITH ROLLUP;

推奨されるMyISAMキーバッファーサイズ(MB)を取得します。

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(pw<0,0,IF(pw>3,0,pw)))+0.49999),
SUBSTR(' KMG',IF(pw<0,0,IF(pw>3,0,pw))+1,1)) recommended_key_buffer_size
FROM (SELECT SUM(index_length) KBS FROM information_schema.tables WHERE
engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) A,
(SELECT 2 pw) B;

GBで推奨されるInnoDBバッファープールサイズを取得する

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(pw<0,0,IF(pw>3,0,pw)))+0.49999),
SUBSTR(' KMG',IF(pw<0,0,IF(pw>3,0,pw))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 3 pw) B;

ストレージエンジンごとのすべてのデータベースのディスク使用量をMB単位で取得します。

SELECT Statistic,DataSize "Data Size",IndexSize "Index Size",TableSize "Table Size"
FROM (SELECT IF(ISNULL(table_schema)=1,10,0) schema_score,
IF(ISNULL(engine)=1,10,0) engine_score,
IF(ISNULL(table_schema)=1,'ZZZZZZZZZZZZZZZZ',table_schema) schemaname,
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=2,"Storage for All Databases",
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=1,CONCAT("Storage for ",B.table_schema),
CONCAT(B.engine," Tables for ",B.table_schema))) Statistic,
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') DataSize,
CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') IndexSize,
CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') TableSize
FROM (SELECT table_schema,engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY table_schema,engine WITH ROLLUP) B,
(SELECT 2 pw) A) AA ORDER BY schemaname,schema_score,engine_score;

信じてください。INFORMATION_SCHEMAには、時間の関係でこれ以上議論することができないほど素晴らしい使い方があります。

INFORMATION_SCHEMAは非常に機密性が高いため、mysqlが実行されている場合に次のことを行うことに注意してください。

cd /var/lib/mysql
mkdir junkfolder

そしてmysqlの実行に入る

mysql> SHOW DATABASES;

Junkfolderがデータベースの1つとして表示されます。

それを知ることは、DBAと開発者にとって非常に重要です。本の第20章(開発者)および第31章(DBA) MySQL 5.0 Certification Study Guide

enter image description here

開発者およびDBA認定試験の準備のためにあります。本を入手し、それらの章をよく研究すれば、MySQLのINFORMATION_SCHEMAを使用してすばらしいことができます。

MySQL 5.5以降のINFORMATION_SCHEMAデータベースには、プラグイン、グローバル変数(ステータスと静的)、セッション変数(ステータスと静的)、ストレージエンジンステータス、パフォーマンスメトリックインストルメンテーション、トリガーマップ、イベント(プログラム可能)などが備わっています。

申し訳ありませんが、これはWTMIのように見えるかもしれませんが、INFORMATION_SCHEMAデータベースを使用することを強く支持しています。

30
RolandoMySQLDBA