Como o INFORMATION_SCHEMA é implementado no MySQL?


14

O INFORMATION_SCHEMA é, em teoria, um conjunto de visualizações especificado no padrão SQL que permite ao usuário inspecionar os metadados do sistema. Como isso é implementado no MySQL?

Quando me conecto a uma nova instalação, vejo dois bancos de dados: mysqle information_schema. Depois de usar SHOW CREATE TABLEinstruções no information_schemabanco de dados, parece que não foi implementado como um conjunto de visualizações, mas com tabelas base. Essa suposição está correta? Ou há outras tabelas do sistema ocultas do usuário?


Muito obrigado pelo +1 :) Um último esclarecimento. Depois do que você disse, é correto afirmar que as informações de metadados são lidas diretamente dos arquivos .frm reais correspondentes às tabelas que realmente são materializadas? Portanto, quando o servidor inicializa, ele lê essas informações das tabelas e cria o INFORMATION_SCHEMA. Então, se uma ANALYZE TABLE ou CREATE INDEX ou, em geral, qualquer instrução DDL for executada, o INFORMATION_SCHEMA será atualizado de acordo?
Ivotron

@ivotron: Isso está correto !!! Existem tabelas no INFORMATION_SCHEMA que registram alterações de esquema, como COLUMNS, STATISTICS, TABLE_CONSTRAINTS e assim por diante. Como o INFORMATION_SCHEMA está todo na memória, a gravação de todas as alterações de DDL é quase instantânea.
RolandoMySQLDBA 16/06

Respostas:


30

O banco de dados INFORMATION_SCHEMA é composto de tabelas temporárias usando o mecanismo de armazenamento MEMORY.

Exemplo: Aqui está a tabela INFORMATION_SCHEMA.TABLES no MySQL 5.5.12 (Versão 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)

Não há pasta física para essas tabelas, nem mesmo arquivos .frm. Você não pode mysqldump-lo. Você não pode abandoná-lo. Você não pode adicionar tabelas a ele. Você não pode soltar tabelas dele. Então, onde estão as mesas ???

Todas as tabelas no banco de dados INFORMATION_SCHEMA são armazenadas diretamente na memória como tabelas do mecanismo de armazenamento MEMORY. Eles são totalmente internos ao MySQL, então os mecanismos .frm são tratados no mysqld. Na minha resposta, mostrei pela primeira vez o layout da tabela INFORMATION_SCHEMA.TABLES. É uma tabela temporária na memória. É manipulado usando protocolos de mecanismo de armazenamento. Assim, quando o mysqld é desligado, todas as tabelas information_schema são eliminadas. Quando o mysqld é iniciado, todas as tabelas information_schema são criadas como tabelas TEMPORARY e preenchidas novamente com metadados para todas as tabelas na instância do mysql.

O banco de dados INFORMATION_SCHEMA foi introduzido pela primeira vez no MySQL 5.0 para fornecer acesso a metadados sobre tabelas de outros mecanismos de armazenamento. Por exemplo, você pode MOSTRAR BASES DE DADOS para obter uma lista de bancos de dados. Você também pode consultá-los assim:

SELECT schema_name database FROM information_schema.schemata;

Você pode recuperar nomes de tabelas em um banco de dados de duas maneiras:

use mydb
show tables;

ou

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

Desde a sua criação, o MySQL expandiu o banco de dados INFORMATION_SCHEMA para ter a lista de processos (a partir do MySQL 5.1). Na verdade, você pode consultar a lista de processos procurando consultas demoradas que ainda estejam em execução por pelo menos 10 minutos:

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

Você pode usar o INFORMATION_SCHEMA para fazer todas as coisas elaboradas: como:

Obtenha contagens de todas as tabelas usando mecanismos de armazenamento 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;

Obtenha o tamanho recomendado do buffer de chave MyISAM em 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;

Obtenha o tamanho recomendado do buffer pool do InnoDB em 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;

Obter uso de disco de todos os bancos de dados por mecanismo de armazenamento em 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;

Acredite, ainda há usos mais maravilhosos para o INFORMATION_SCHEMA que o tempo não me permite discutir mais.

Lembre-se de que o INFORMATION_SCHEMA é tão sensível que, se o mysql estiver em execução, e você fizer o seguinte:

cd /var/lib/mysql
mkdir junkfolder

e depois entrar no mysql run

mysql> SHOW DATABASES;

Você verá a pasta de lixo eletrônico como um dos bancos de dados.

Saber isso é muito vital para DBAs e desenvolvedores. Capítulo 20 (desenvolvedores) e Capítulo 31 (DBAs) do livro MySQL 5.0 Certification Study Guide

insira a descrição da imagem aqui

existem para a preparação para os exames de certificação Developer e DBA. Compre o livro, estude bem esses capítulos e você poderá fazer grandes coisas com o INFORMATION_SCHEMA do MySQL.

O banco de dados INFORMATION_SCHEMA a partir do MySQL 5.5, agora possui plugins, variáveis ​​globais (status e estático), variáveis ​​de sessão (status e estático), status do mecanismo de armazenamento, instrumentação de métricas de desempenho, mapa de acionador, eventos (programáveis) e muito mais.

Desculpe, isso pode parecer WTMI, mas sou um grande defensor do uso do banco de dados INFORMATION_SCHEMA.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.