【決定版】MariaDBのInformation Schema InnoDBテーブル:プログラミングコードと統計情報でInnoDBを最適化する


MariaDBのInformation Schema InnoDBテーブルは、InnoDBストレージエンジンに関する詳細なメタデータ、ステータス情報、統計情報へのアクセスを提供します。これらのテーブルは、データベース管理者や開発者がInnoDBテーブルのパフォーマンスを監視し、問題を診断し、チューニングするのに役立ちます。

主要なInformation Schema InnoDBテーブル

以下の表は、主要なInformation Schema InnoDBテーブルとその説明を示しています。

テーブル名説明
INNODB_BUFFER_POOL_STATSInnoDBバッファープールの統計情報
INNODB_CMPMEMInnoDB圧縮メモリ使用量に関する統計情報
INNODB_CMPInnoDB圧縮に関する統計情報
INNODB_CMP_RESETInnoDB圧縮統計のリセット
INNODB_CMPMEM_RESETInnoDB圧縮メモリ使用量統計のリセット
INNODB_FILESInnoDBテーブルファイルに関する情報
INNODB_INDEXESInnoDBインデックスに関する情報
INNODB_MUTEXInnoDBミューテックスに関する情報
INNODB_OPTIMIZER_SETTINGSInnoDBオプティマイザ設定に関する情報
INNODB_ROWSInnoDBテーブル内の行数に関する情報
INNODB_SES_VARSInnoDBセッション変数に関する情報
INNODB_STATUSInnoDB全体のステータス情報
INNODB_SYS_DATAFILESInnoDBシステムデータファイルに関する情報
INNODB_TABLE_STATSInnoDBテーブル統計情報
INNODB_TABLESInnoDBテーブルに関する情報
INNODB_TRXInnoDBトランザクションに関する情報

使用方法

Information Schema InnoDBテーブルは、他のInformation Schemaテーブルと同様に、SELECTステートメントを使用してクエリできます。たとえば、すべてのInnoDBテーブルのリストを取得するには、次のクエリを使用します。

SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES;
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = 'mytable';

プログラミングでの使用例

Information Schema InnoDBテーブルは、データベースアプリケーションでInnoDBテーブルのパフォーマンスを監視およびチューニングするために使用できます。たとえば、次のスクリプトは、すべてのInnoDBテーブルの平均行長を表示します。

import mysql.connector

db = mysql.connector.connect(host="localhost", user="username", password="password", database="mydatabase")
cursor = db.cursor()

cursor.execute("SELECT TABLE_NAME, AVG_ROW_LENGTH FROM INFORMATION_SCHEMA.INNODB_TABLES")
for row in cursor:
    table_name = row[0]
    avg_row_length = row[1]
    print(f"Table: {table_name}, Average Row Length: {avg_row_length}")

db.close()

注意事項

Information Schema InnoDBテーブルは、InnoDBストレージエンジンに関する詳細な情報を提供しますが、すべての情報が含まれているわけではありません。特定のInnoDBテーブルに関する詳細については、SHOW TABLE STATUSステートメントを使用する必要があります。



すべての InnoDB テーブルの平均行長を表示する

このスクリプトは、すべての InnoDB テーブルの平均行長を表示します。これは、テーブルのサイズとパフォーマンスを評価するのに役立ちます。

import mysql.connector

db = mysql.connector.connect(host="localhost", user="username", password="password", database="mydatabase")
cursor = db.cursor()

cursor.execute("SELECT TABLE_NAME, AVG_ROW_LENGTH FROM INFORMATION_SCHEMA.INNODB_TABLES")
for row in cursor:
    table_name = row[0]
    avg_row_length = row[1]
    print(f"Table: {table_name}, Average Row Length: {avg_row_length}")

db.close()

特定の InnoDB テーブルのインデックス使用率を表示する

このスクリプトは、特定の InnoDB テーブルのインデックス使用率を表示します。これは、インデックスが効果的に使用されているかどうかを判断するのに役立ちます。

import mysql.connector

db = mysql.connector.connect(host="localhost", user="username", password="password", database="mydatabase")
cursor = db.cursor()

table_name = "mytable"  # 変更する必要あり

cursor.execute(f"SELECT INDEX_NAME, USE_COUNT, USE_ROWS FROM INFORMATION_SCHEMA.INNODB_INDEXES WHERE TABLE_NAME = '{table_name}'")
for row in cursor:
    index_name = row[0]
    use_count = row[1]
    use_rows = row[2]
    print(f"Index: {index_name}, Use Count: {use_count}, Use Rows: {use_rows}")

db.close()

InnoDB バッファープールの統計情報を表示する

このスクリプトは、InnoDB バッファープールの統計情報を表示します。これは、バッファープールのヒット率とミス率を判断するのに役立ちます。

import mysql.connector

db = mysql.connector.connect(host="localhost", user="username", password="password", database="mydatabase")
cursor = db.cursor()

cursor.execute("SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS")
for row in cursor:
    data_reads = row[1]
    data_writes = row[2]
    buffer_pool_reads = row[3]
    buffer_pool_wait_free = row[4]
    buffer_pool_hit_rate = row[5]

    print(f"Data Reads: {data_reads}")
    print(f"Data Writes: {data_writes}")
    print(f"Buffer Pool Reads: {buffer_pool_reads}")
    print(f"Buffer Pool Wait Free: {buffer_pool_wait_free}")
    print(f"Buffer Pool Hit Rate: {buffer_pool_hit_rate}")

db.close()

InnoDB テーブルのページサイズを表示する

このスクリプトは、InnoDB テーブルのページサイズを表示します。これは、テーブルのパフォーマンスとストレージ要件を判断するのに役立ちます。

import mysql.connector

db = mysql.connector.connect(host="localhost", user="username", password="password", database="mydatabase")
cursor = db.cursor()

table_name = "mytable"  # 変更する必要あり

cursor.execute(f"SELECT PAGE_SIZE FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TABLE_NAME = '{table_name}'")
for row in cursor:
    page_size = row[0]
    print(f"Page Size: {page_size}")

db.close()

InnoDB テーブルのロック情報を表示する

このスクリプトは、InnoDB テーブルのロック情報を表示します。これは、ロック競合を特定して解決するのに役立ちます。

import mysql.connector

db = mysql.connector.connect(host="localhost", user="username", password="password", database="mydatabase")
cursor = db.cursor()

cursor.execute("SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX")
for row in cursor:
    trx_id = row[0]
    trx_state = row[1]
    trx_isolation = row[2]
    


Information Schema InnoDB テーブルは、InnoDB ストレージ エンジンに関する詳細なメタデータ、ステータス情報、統計情報へのアクセスを提供します。しかし、いくつかの代替手段があり、それぞれ長所と短所があります。

代替手段

SHOW TABLE STATUS LIKE 'mytable';
  1. パフォーマンス スキーマ
    パフォーマンス スキーマは、データベースのパフォーマンスに関するリアルタイムの情報を提供します。InnoDB に関する情報を含む多くのメトリックが含まれています。
SELECT * FROM performance_schema.events_statements_summary_by_digest WHERE SCHEMA_NAME = 'mydatabase' AND TABLE_NAME = 'mytable';
  • サポート
    一部の代替手段は、Information Schema InnoDB テーブルほどサポートされていない可能性があります。
  • パフォーマンス
    一部の代替手段は、Information Schema InnoDB テーブルよりもパフォーマンスが低下する可能性があります。
  • 複雑性
    一部の代替手段は、Information Schema InnoDB テーブルよりも複雑である可能性があります。