Come viene implementato INFORMATION_SCHEMA in MySQL?


14

INFORMATION_SCHEMA è, in teoria, un insieme di viste specificato nello standard SQL che consente all'utente di ispezionare i metadati del sistema. Come viene implementato in MySQL?

Quando mi collego a una nuova installazione vedo due database: mysqle information_schema. Dopo aver usato le SHOW CREATE TABLEistruzioni sul information_schemadatabase, sembra che non sia implementato come un insieme di viste ma con tabelle di base. Questo assunto è corretto? Oppure ci sono altre tabelle di sistema che sono nascoste all'utente?


Grazie mille per il +1 :) Un ultimo chiarimento. Dopo quello che hai detto, è giusto affermare che le informazioni sui metadati vengono lette direttamente dai file .frm reali corrispondenti alle tabelle che sono effettivamente materializzate? Pertanto, all'avvio del server, legge tali informazioni dalle tabelle e crea INFORMATION_SCHEMA. Quindi se viene eseguita un'ANALYZE TABLE o un CREATE INDEX o in generale qualsiasi istruzione DDL, INFORMATION_SCHEMA viene aggiornato di conseguenza?
Ivotron,

@ivotron: questo è corretto !!! Ci sono tabelle in INFORMATION_SCHEMA che registrano le modifiche dello schema come COLUMNS, STATISTICS, TABLE_CONSTRAINTS e così via. Poiché INFORMATION_SCHEMA è tutto in memoria, la registrazione di tutte le modifiche DDL è quasi istantanea.
RolandoMySQLDBA il

Risposte:


30

Il database INFORMATION_SCHEMA è costituito da tabelle temporanee che utilizzano il motore di archiviazione MEMORY.

Esempio: ecco la tabella INFORMATION_SCHEMA.TABLES in MySQL 5.5.12 (versione 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)

Non esiste una cartella fisica per quelle tabelle, nemmeno i file .frm. Non puoi mysqldump. Non puoi lasciarlo cadere. Non è possibile aggiungere tabelle ad esso. Non è possibile eliminare tabelle da esso. Quindi, dove sono i tavoli ???

Tutte le tabelle nel database INFORMATION_SCHEMA sono archiviate direttamente in memoria come tabelle del motore di archiviazione MEMORY. Sono totalmente interni a MySQL, quindi i meccanismi .frm sono gestiti in mysqld. Nella mia risposta, ho prima mostrato il layout della tabella di INFORMATION_SCHEMA.TABLES. È una tabella temporanea in memoria. Viene manipolato utilizzando i protocolli del motore di archiviazione. Pertanto, quando mysqld viene arrestato, tutte le tabelle information_schema vengono eliminate. All'avvio di mysqld, tutte le tabelle information_schema vengono create come tabelle TEMPORANEE e ripopolate con metadati per ogni tabella nell'istanza mysql.

Il database INFORMATION_SCHEMA è stato introdotto per la prima volta in MySQL 5.0 per consentire l'accesso ai metadati relativi alle tabelle di altri motori di archiviazione. Ad esempio, è possibile eseguire SHOW DATABASES per ottenere un elenco di database. Puoi anche fare una query per loro in questo modo:

SELECT schema_name database FROM information_schema.schemata;

È possibile recuperare i nomi delle tabelle in un database in due modi:

use mydb
show tables;

o

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

Fin dalla sua istituzione, MySQL ha ampliato il database INFORMATION_SCHEMA per includere l'elenco dei processi (a partire da MySQL 5.1). Puoi effettivamente eseguire una query sull'elenco dei processi alla ricerca di query a esecuzione prolungata che siano ancora in esecuzione per almeno 10 minuti:

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

Puoi utilizzare INFORMATION_SCHEMA per eseguire tutte le operazioni elaborate: come:

Ottieni conteggi di tutte le tabelle utilizzando specifici motori di archiviazione:

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;

Ottieni le dimensioni consigliate per il buffer delle chiavi MyISAM in 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;

Ottieni le dimensioni consigliate del pool di buffer InnoDB in 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;

Ottieni l'utilizzo del disco di tutti i database dal motore di archiviazione in 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;

Credetemi, ci sono ancora usi meravigliosi per INFORMATION_SCHEMA che il tempo non mi consente di discutere ulteriormente.

Tieni presente che INFORMATION_SCHEMA è così sensibile che se mysql è in esecuzione e fai quanto segue:

cd /var/lib/mysql
mkdir junkfolder

e poi vai in mysql run

mysql> SHOW DATABASES;

Vedrai junkfolder come uno dei database.

Conoscerlo è molto vitale per DBA e sviluppatori. Capitolo 20 (sviluppatori) e Capitolo 31 (DBA) del libro MySQL 5.0 Guida allo studio di certificazione

inserisci qui la descrizione dell'immagine

sono lì per la preparazione per gli esami di certificazione Developer e DBA. Prendi il libro, studia bene quei capitoli e potresti fare grandi cose con il MySQL_SCHEMA di MySQL.

Il database INFORMATION_SCHEMA a partire da MySQL 5.5, ora include plug-in, variabili globali (stato e statico), variabili di sessione (stato e statico), stato del motore di archiviazione, strumentazione delle metriche delle prestazioni, mappa di trigger, eventi (programmabili) e molto altro.

Mi dispiace che possa sembrare WTMI, ma sono un grande sostenitore dell'utilizzo del database INFORMATION_SCHEMA.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.