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、すべてのデータベースのスキャンが含まれます。
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.collation_id | 1 | 100.00 | インデックスを使用 | +----+-------------+-----------+-----------+----------+--------------------+----------+----------+-------------------------------+------+----------+----------------------------------------------+ 以上がMySQL 8.0 ディクショナリテーブル機能強化の詳細な説明です。MySQL 8.0 ディクショナリテーブル機能強化の詳細については、123WORDPRESS.COM の他の関連記事にも注目してください。 以下もご興味があるかもしれません:
|
<<: 古い Vue プロジェクトに Vite サポートを追加する方法
>>: Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します
目次序文基本的な使い方文法エラー処理プロミスチェーン呼び出し非同期と待機よく使われる方法1. Pro...
私は長い間 CSS を使用してきましたが、Web 要素の関連属性を設定するために常に「px」を使用し...
1. 必要なパッケージをダウンロードする wget -P /usr/local https://st...
この記事では、シンプルなカレンダー効果を実現するためのjsの具体的なコードを参考までに共有します。具...
前提条件: nginx には、ngx_http_limit_conn_module モジュールと n...
MySQL では、LOAD_FILE() 関数はファイルを読み取り、その内容を文字列として返します。...
通常は、最初に Dockerfile ファイルを定義し、次に docker build コマンドを使...
1. 事前に準備する便宜上、ここで 2 つのテーブルを作成し、そこにいくつかのデータを追加します。果...
この記事では、例を使用して、Mysql データベースの基本的な SQL ステートメントについて説明し...
この記事では、JavaScript メッセージ ボードでメッセージを追加および削除する小さな例を詳細...
この記事では、Linux システムを起動する方法について説明します。ご参考までに、詳細は以下の通りで...
最近、UTF8 エンコードの中国語 Zen Cart Web サイトをデバッグしているときに奇妙な現...
Tomcat は内部的に複数の ClassLoader を定義し、アプリケーションとコンテナーが異な...
開発の問題点開発プロセスでは、データベース フィールドが頻繁に変更されるため、RD 環境と QA 環...
目次序文ローカルストレージの使用シナリオ使用上の問題解決機能性有効期限を追加データ暗号化を追加する命...