Comment INFORMATION_SCHEMA est-il implémenté dans MySQL?

14

L'INFORMATION_SCHEMA est, en théorie, un ensemble de vues spécifié dans la norme SQL qui permet à l'utilisateur d'inspecter les métadonnées du système. Comment est-ce implémenté dans MySQL?

Lorsque je me connecte à une nouvelle installation, je vois deux bases de données: mysqlet information_schema. Après avoir utilisé des SHOW CREATE TABLEinstructions sur la information_schemabase de données, il semble qu'il ne soit pas implémenté comme un ensemble de vues, mais plutôt avec des tables de base. Cette hypothèse est-elle correcte? Ou y a-t-il d'autres tables système qui sont cachées à l'utilisateur?

ivotron
la source
Merci beaucoup pour le +1 :) Une dernière précision. Après ce que vous avez dit, est-il exact de déclarer que les informations de métadonnées sont lues directement à partir des fichiers .frm réels correspondant aux tables qui sont réellement matérialisées? Ainsi, lorsque le serveur démarre, il lit ces informations dans les tables et crée INFORMATION_SCHEMA. Alors si une ANALYZE TABLE ou un CREATE INDEX ou en général une instruction DDL est exécutée, le INFORMATION_SCHEMA est mis à jour en conséquence?
ivotron
@ivotron: C'est correct !!! Il existe des tables dans INFORMATION_SCHEMA qui enregistrent les modifications de schéma telles que COLONNES, STATISTIQUES, TABLE_CONSTRAINTS, etc. Étant donné que INFORMATION_SCHEMA est entièrement en mémoire, l'enregistrement de toutes les modifications DDL est presque instantané.
RolandoMySQLDBA

Réponses:

30

La base de données INFORMATION_SCHEMA est constituée de tables temporaires utilisant le moteur de stockage MEMORY.

Exemple: voici la table INFORMATION_SCHEMA.TABLES dans MySQL 5.5.12 (version Windows)

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)

Il n'y a pas de dossier physique pour ces tables, pas même les fichiers .frm. Vous ne pouvez pas le masquer. Vous ne pouvez pas le laisser tomber. Vous ne pouvez pas y ajouter de tables. Vous ne pouvez pas en supprimer de tables. Alors, où sont les tables ???

Toutes les tables de la base de données INFORMATION_SCHEMA sont stockées directement en mémoire en tant que tables du moteur de stockage MEMORY. Ils sont totalement internes à MySQL, donc les mécanismes .frm sont gérés dans mysqld. Dans ma réponse, j'ai d'abord montré la disposition de la table INFORMATION_SCHEMA.TABLES. Il s'agit d'une table temporaire en mémoire. Il est manipulé à l'aide des protocoles du moteur de stockage. Ainsi, lorsque mysqld est arrêté, toutes les tables information_schema sont supprimées. Lorsque mysqld est démarré, toutes les tables information_schema sont créées en tant que tables TEMPORARY et remplies de métadonnées pour chaque table de l'instance mysql.

La base de données INFORMATION_SCHEMA a été introduite pour la première fois dans MySQL 5.0 pour vous donner accès aux métadonnées sur les tables d'autres moteurs de stockage. Par exemple, vous pouvez faire SHOW DATABASES pour obtenir une liste de bases de données. Vous pouvez également les interroger comme ceci:

SELECT schema_name database FROM information_schema.schemata;

Vous pouvez récupérer les noms de table dans une base de données de deux manières:

use mydb
show tables;

ou

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

Depuis sa création, MySQL a étendu la base de données INFORMATION_SCHEMA pour avoir la liste des processus (à partir de MySQL 5.1). Vous pouvez réellement interroger la liste de processus à la recherche de longues requêtes qui s'exécutent encore au moins 10 minutes:

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

Vous pouvez utiliser le INFORMATION_SCHEMA pour faire toutes les choses élaborées: telles que:

Obtenez le nombre de toutes les tables à l'aide de moteurs de stockage spécifiques:

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;

Obtenez la taille de mémoire tampon de clé MyISAM recommandée en Mo

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;

Obtenez la taille de pool de mémoire tampon InnoDB recommandée en Go

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;

Obtenir l'utilisation du disque de toutes les bases de données par moteur de stockage en Mo

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;

Croyez-moi, il existe des utilisations encore plus merveilleuses pour INFORMATION_SCHEMA que le temps ne me permet pas de discuter plus avant.

Veuillez garder à l'esprit que INFORMATION_SCHEMA est si sensible que si mysql est en cours d'exécution et que vous effectuez les opérations suivantes:

cd /var/lib/mysql
mkdir junkfolder

puis allez dans mysql run

mysql> SHOW DATABASES;

Vous verrez le dossier indésirable comme l'une des bases de données.

Le savoir est très important pour les administrateurs de base de données et les développeurs. Chapitre 20 (développeurs) et Chapitre 31 (DBA) du livre MySQL 5.0 Certification Study Guide

entrez la description de l'image ici

sont là pour se préparer aux examens de certification développeur et DBA. Obtenez le livre, étudiez bien ces chapitres et vous pourriez faire de grandes choses avec INFORMATION_SCHEMA de MySQL.

La base de données INFORMATION_SCHEMA à partir de MySQL 5.5, comprend désormais des plugins, des variables globales (état et statique), des variables de session (état et statique), l'état du moteur de stockage, l'instrumentation des mesures de performances, la carte de déclenchement, les événements (programmables) et bien plus encore.

Désolé, cela peut ressembler à WTMI, mais je suis un grand partisan de l'utilisation de la base de données INFORMATION_SCHEMA.

RolandoMySQLDBA
la source