MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFORMATION_SCHEMA は、実行中の MySQL サーバーからメタデータを取得するための標準準拠の方法として、MySQL 5.0 で初めて導入されました。 MySQL サーバーに関するデータ メタデータ、統計情報、アクセス情報 (データベース名またはテーブル名、フィールド データ型、アクセス権限など) を保存するために使用されます。

8.0 より前:

1. メタデータはファイルから取得されます

2. MEMORYテーブルエンジンを使用する

3. frmファイルはテーブル構造情報を保存します

4. opt ファイルには、ライブラリの文字セットなど、各ライブラリの基本情報が記録されます。

5. .TRNおよび.TRGファイルはトリガー情報を保存するために使用されます

5.6> information_schema.tables から TABLE_SCHEMA、ENGINE、COUNT(*) を選択します。ここで、table_schema in ('information_schema'、'mysql'、'performance_schema'、'sys') group by TABLE_SCHEMA、ENGINE;
+--------------------+--------------------+----------+
| TABLE_SCHEMA | エンジン | COUNT(*) |
+--------------------+--------------------+----------+
| 情報スキーマ | メモリ | 49 |
| 情報スキーマ | MyISAM | 10 |
| mysql | CSV | 2 |
| mysql | InnoDB | 6 |
| mysql | MyISAM | 21 |
| パフォーマンス スキーマ | パフォーマンス スキーマ | 52 |
+--------------------+--------------------+----------+
5.7> information_schema.tables から TABLE_SCHEMA、ENGINE、COUNT(*) を選択します。ここで、table_schema in ('information_schema'、'mysql'、'performance_schema'、'sys') group by TABLE_SCHEMA、ENGINE;
+--------------------+--------------------+----------+
| TABLE_SCHEMA | エンジン | COUNT(*) |
+--------------------+--------------------+----------+
| 情報スキーマ | InnoDB | 10 |
| 情報スキーマ | メモリ | 51 |
| mysql | CSV | 2 |
| MySQL | InnoDB | 19 |
| mysql | MyISAM | 10 |
| パフォーマンス スキーマ | パフォーマンス スキーマ | 87 |
| システム | NULL | 100 |
| sys | InnoDB | 1 |
+--------------------+--------------------+----------+

8.0 以降:

1. テーブルにメタデータが存在する

2. すべてMySQLデータベースに移動され、InnoDBテーブルエンジンに変更され、非表示になります

3. Information_schemaはviewを通じてのみ閲覧可能

4. すべてのNULLはビューである

5. 別のテーブルスペースmysql.ibdに保存されます

8.0> テーブルから TABLE_SCHEMA、ENGINE、count(*) を選択します。ここで、TABLE_SCHEMA は ('information_schema'、'mysql'、'performance_schema'、'sys') でグループ化されます。TABLE_SCHEMA、ENGINE;
+--------------------+--------------------+----------+
| TABLE_SCHEMA | ENGINE | カウント(*) |
+--------------------+--------------------+----------+
| 情報スキーマ | NULL | 65 |
| MySQL | InnoDB | 31 |
| mysql | CSV | 2 |
| パフォーマンス スキーマ | パフォーマンス スキーマ | 102 |
| システム | NULL | 100 |
| sys | InnoDB | 1 |
+--------------------+--------------------+----------+

5.7 ではいくつかの改善が行われました。しかし、INFORMATION_SCHEMA のパフォーマンスは、多くのユーザーにとって依然として大きな悩みの種となっています。現在の INFORMATION_SCHEMA 実装におけるパフォーマンスの問題の主な原因は、INFORMATION_SCHEMA テーブルに対するクエリが、クエリ実行中に一時テーブルが作成される方法で実装されていることです。

次のように、テーブルフラグメントをクエリします。

5.7> explain select round(DATA_FREE/1024/1024) as DATA_FREE from information_schema.TABLES where DATA_FREE/1024/1024 > 1024 and TABLE_SCHEMA not in ('information_schema', 'mysql', 'performance_schema', 'sys');
+----+-------------+--------+-------+---------------+-------+-------+------+------+-----------------------------------------------------+
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
+----+-------------+--------+-------+---------------+-------+-------+------+------+-----------------------------------------------------+
| 1 | SIMPLE | TABLES | ALL | NULL | NULL | NULL | NULL | NULL | where を使用します。Open_full_table; すべてのデータベースをスキャンしました |
+----+-------------+--------+-------+---------------+-------+-------+------+------+-----------------------------------------------------+

追加情報には、Open_full_table、すべてのデータベースのスキャンが含まれます。
Skip_open_table、Open_frm_only、Open_full_table これらの値は、INFORMATION_SCHEMA テーブルクエリのファイルオープンの最適化を示します。

  • Skip_open_table: テーブル ファイルを開く必要はありません。データベース カタログをスキャンすることにより、クエリで情報が利用可能になりました。
  • Open_frm_only: テーブルの .frm ファイルのみを開く必要があります。
  • Open_full_table: 最適化されていない情報検索。 .frm、.MYD、および .MYI ファイルを開く必要があります。
  • スキャンされた N 個のデータベース: information_schema クエリを処理するときにスキャンする必要があるディレクトリの数を示します。

MySQL インスタンスに数百のデータベースがあり、それぞれに数百のテーブルがある場合、INFORMATION_SCHEMA クエリは最終的にファイル システムから個々の frm ファイルを読み取ることになり、大量の I/O 読み取りが発生します。また、テーブルを開いて関連するメモリ内データ構造を準備するために、より多くの CPU を消費することになります。 MySQL サーバー レベルのテーブル キャッシュ (table_definition_cache システム変数) の使用を試みますが、大規模なインスタンスでは、すべてのテーブルを保持するのに十分な大きさのテーブル キャッシュが存在することはほとんどありません。そのため、メモリ使用量が大幅に増加し、OOM が発生する可能性もあります。

通常、この問題を解決するには次の方法を使用します。

1. ライブラリテーブルを分割して、1つのインスタンスで開かれるファイルの数を減らす

2. table_definition_cacheとtable_open_cacheの数を調整する

3. 物理メモリを追加する

MySQL 8.0 のリリース後、別のオプションが提供されました。ディクショナリ テーブルは InnoDB エンジンを使用するため、ディクショナリ テーブルでインデックスを使用できます。

次の図は、MySQL 5.7 と 8.0 の設計上の違いを説明しています。

8.0> explain select table_name,table_rows,concat(round(DATA_LENGTH/1024/1024, 2), 'MB') as size,concat(round(INDEX_LENGTH/1024/1024, 2), 'MB') as index_size,DATA_FREE/1024/1024 AS data_free_MB from information_schema.TABLES where table_schema not in ('information_schema','performance_schema','test') order by data_free_MB desc limit 10;
+----+-------------+-----------+-----------+----------+--------------------+----------+----------+-------------------------------+------+----------+----------------------------------------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+-----------+-----------+----------+--------------------+----------+----------+-------------------------------+------+----------+----------------------------------------------+
| 1 | SIMPLE | cat | NULL | index | PRIMARY | name | 194 | NULL | 1 | 100.00 | インデックスの使用; 一時の使用; ファイルソートの使用 |
| 1 | SIMPLE | sch | NULL | ref | PRIMARY,catalog_id | catalog_id | 8 | mysql.cat.id | 6 | 50.00 | where の使用; インデックスの使用 |
| 1 | SIMPLE | tbl | NULL | ref | schema_id | schema_id | 8 | mysql.sch.id | 52 | 100.00 | where の使用 |
| 1 | SIMPLE | ts | NULL | eq_ref | PRIMARY | PRIMARY | 8 | mysql.tbl.tablespace_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | stat | NULL | eq_ref | PRIMARY | PRIMARY | 388 | mysql.sch.name、mysql.tbl.name | 1 | 100.00 | NULL |
| 1 | SIMPLE | col | NULL | eq_ref | PRIMARY | PRIMARY | 8 | mysql.tbl.collat​​ion_id | 1 | 100.00 | インデックスを使用 |
+----+-------------+-----------+-----------+----------+--------------------+----------+----------+-------------------------------+------+----------+----------------------------------------------+

以上がMySQL 8.0​ ディクショナリテーブル機能強化の詳細な説明です。MySQL 8.0​ ディクショナリテーブル機能強化の詳細については、123WORDPRESS.COM の他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • MySQLユーザーがパスワードを忘れたり、パスワードの有効期限が切れたりする問題に対処する方法
  • MySQLユーザーパスワード有効期限機能の詳細な説明
  • MySQL パスワードの有効期限が切れたため、MySQL に接続できませんでした
  • MySQL 8.0 の降順インデックス
  • Dockerを使用してMySQL 8.0をデプロイする方法の例
  • MySQL 8.0 の binlog の詳細な説明
  • MySQL 8.0 で列を素早く追加する方法
  • 写真とテキストによる MySQL 8.0.21 インストール チュートリアル
  • Windows システムでの MySQL 8.0.21 インストール チュートリアル (図とテキスト)
  • MySQL 8.0.21.0 コミュニティ エディションのインストール チュートリアル (詳細な図解)
  • MySQL 8.0 パスワード有効期限ポリシーの詳細な説明

<<:  古い Vue プロジェクトに Vite サポートを追加する方法

>>:  Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します

推薦する

MySQL 5.7.9 バージョンの sql_mode=only_full_group_by 問題を解決する

MySQL 5.7.9 バージョンの sql_mode=only_full_group_by の問題...

JS の compose 関数と pipe 関数の使い方の詳細な説明

目次作成機能配列プロトタイプの削減Array.prototype.reduceRightパイプ関数作...

docker inspect コマンドの使用に関するヒント

説明と紹介Docker inspect は Docker クライアントのネイティブ コマンドであり、...

qt.qpa.plugin の問題を解決: Ubuntu 18.04 の Qt で Qt プラットフォーム プラグイン「xcb」をロードできませんでした

問題の説明Qt5.15.0 をインストールした後、テスト ケースを実行するとエラーが表示されます。 ...

Docker+Jenkins+Gitlab+Djangoアプリケーションデプロイ実践の詳細な説明

1. 背景インターネット アプリケーションの急速な更新と反復という状況では、従来の手作業や単純なスク...

フロントエンドJSサンドボックスを実装するいくつかの方法についての簡単な説明

目次序文iframeはサンドボックスを実装しますdiffメソッドを使用したサンドボックスの実装プロキ...

CentOS での MySQL ワークベンチのインストールと設定のチュートリアル

この記事では、MySQL Workbenchのインストールと設定のチュートリアルを参考までに紹介しま...

HTML面接の質問の要約

1. doctypeの役割、厳密モードと混合モードの違い、そしてその重要性1. 構文形式: <...

JavaScriptのポイントごとのシリーズでこれは何ですか

これを理解するおそらく、他のオブジェクト指向プログラミング言語でもthis見たことがあり、これがコン...

http-proxy-middlewareを使用してNodeでプロキシクロスドメインを実装する方法と手順

目次1. プロキシモジュールをインストールする2. プロキシを設定する1. プロキシモジュールをイン...

Mysql sql スロークエリ監視スクリプトコード例

1. my.cnfを変更する #全体的な効果としては、グローバルがオンになっている場合はテーブルとロ...

Vue+element+oss はフロントエンドのフラグメントアップロードとブレークポイント再開を実現します

純粋なフロントエンド実装:切片上傳斷點續傳。斷點續傳カットとアップロードに基づいて実装する必要があり...

太陽系の惑星のアニメーション効果を実現するHTML+CSS3コード

太陽系の 8 つの惑星(衛星を除く)のアニメーションを作成します。すべての惑星は太陽の周りを回ってい...

HTMLはテキスト行のインターセプトの実装原理とコードを超えています

複数行を超えるテキストをインターセプトするための HTML コードは次のとおりです。 HTML:コー...

MySQL での挿入効率のいくつかの例の比較

序文最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がか...