¿Cómo se implementa INFORMATION_SCHEMA en MySQL?


14

INFORMATION_SCHEMA es, en teoría, un conjunto de vistas especificadas en el estándar SQL que permiten al usuario inspeccionar los metadatos del sistema. ¿Cómo se implementa esto en MySQL?

Cuando me conecto a una instalación nueva, veo dos bases de datos: mysqly information_schema. Después de usar SHOW CREATE TABLEdeclaraciones en la information_schemabase de datos, parece que no está implementado como un conjunto de vistas, sino con tablas base. ¿Es correcta esta suposición? ¿O hay otras tablas del sistema que están ocultas para el usuario?


Muchas gracias por el +1 :) Una última aclaración. Después de lo que ha dicho, ¿es correcto afirmar que la información de metadatos se lee directamente de los archivos .frm reales correspondientes a las tablas que realmente se materializan? Entonces, cuando el servidor arranca, lee esa información de las tablas y crea el INFORMATION_SCHEMA. Entonces, si se ejecuta una TABLA DE ANÁLISIS o un ÍNDICE DE CREACIÓN o, en general, se ejecuta una instrucción DDL, ¿se actualiza el INFORMATION_SCHEMA en consecuencia?
Ivotron

@ivotron: ¡Esto es correcto! Hay tablas en INFORMATION_SCHEMA que registran cambios en el esquema, como COLUMNS, STATISTICS, TABLE_CONSTRAINTS, etc. Debido a que INFORMATION_SCHEMA está todo en la memoria, la grabación de todos los cambios DDL es casi instantánea.
RolandoMySQLDBA

Respuestas:


30

La base de datos INFORMATION_SCHEMA está compuesta de tablas temporales que utilizan el motor de almacenamiento MEMORY.

Ejemplo: Aquí está la tabla INFORMATION_SCHEMA.TABLES en MySQL 5.5.12 (versión de 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)

No hay una carpeta física para esas tablas, ni siquiera archivos .frm. No puedes mysqldump. No puedes dejarlo caer. No puede agregarle tablas. No puedes soltar tablas de él. Entonces, ¿dónde están las mesas?

Todas las tablas en la base de datos INFORMATION_SCHEMA se almacenan directamente en la memoria como tablas del motor de almacenamiento MEMORY. Son totalmente internos a MySQL, por lo que los mecanismos .frm se manejan en mysqld. En mi respuesta, primero mostré el diseño de la tabla de INFORMATION_SCHEMA.TABLES. Es una tabla temporal en la memoria. Se manipula utilizando protocolos de motor de almacenamiento. Por lo tanto, cuando mysqld se cierra, todas las tablas de información_esquema se descartan. Cuando se inicia mysqld, todas las tablas de información_esquema se crean como tablas TEMPORALES y se vuelven a llenar con metadatos para cada tabla en la instancia de mysql.

La base de datos INFORMATION_SCHEMA se introdujo por primera vez en MySQL 5.0 para darle acceso a metadatos sobre tablas de otros motores de almacenamiento. Por ejemplo, podría hacer SHOW DATABASES para obtener una lista de bases de datos. También puede consultarlos de esta manera:

SELECT schema_name database FROM information_schema.schemata;

Puede recuperar nombres de tablas en una base de datos de dos maneras:

use mydb
show tables;

o

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

Desde su inicio, MySQL ha expandido la base de datos INFORMATION_SCHEMA para tener la lista de procesos (a partir de MySQL 5.1). En realidad, puede consultar la lista de procesos buscando consultas de larga duración que todavía se ejecutan al menos 10 minutos:

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

Puede usar INFORMATION_SCHEMA para hacer todas las cosas elaboradas: como:

Obtenga recuentos de todas las tablas utilizando motores de almacenamiento específicos:

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;

Obtenga el tamaño recomendado de MyISAM Key Buffer en 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;

Obtenga el tamaño recomendado de InnoDB Buffer Pool en GB

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;

Obtenga el uso de disco de todas las bases de datos por motor de almacenamiento en 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;

Créame, todavía hay usos más maravillosos para INFORMATION_SCHEMA que el tiempo no me permite discutir más.

Tenga en cuenta que INFORMATION_SCHEMA es tan sensible que si mysql se está ejecutando y usted hace lo siguiente:

cd /var/lib/mysql
mkdir junkfolder

y luego entra en mysql run

mysql> SHOW DATABASES;

Verá la carpeta basura como una de las bases de datos.

Saberlo es muy vital para los DBA y los desarrolladores. Capítulo 20 (desarrolladores) y Capítulo 31 (DBA) del libro MySQL 5.0 Certification Study Guide

ingrese la descripción de la imagen aquí

están allí para prepararse para los exámenes de certificación de desarrollador y DBA. Obtenga el libro, estudie bien esos capítulos y podría hacer grandes cosas con la información_SCHEMA de MySQL.

La base de datos INFORMATION_SCHEMA a partir de MySQL 5.5, ahora presenta complementos, variables globales (estado y estática), variables de sesión (estado y estática), estado del motor de almacenamiento, instrumentación de métricas de rendimiento, mapa de disparo, eventos (programables) y mucho más.

Lo siento, esto puede parecer WTMI, pero soy un gran defensor del uso de la base de datos INFORMATION_SCHEMA.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.