W jaki sposób INFORMACJE_SCHEMA jest implementowane w MySQL?

14

INFORMACJE_SCHEMA to teoretycznie zestaw widoków określonych w standardzie SQL, które pozwalają użytkownikowi na sprawdzenie metadanych systemu. Jak to jest zaimplementowane w MySQL?

Po podłączeniu do nowej instalacji widzę dwie bazy danych: mysqli information_schema. Po użyciu SHOW CREATE TABLEinstrukcji w information_schemabazie danych wygląda na to, że nie jest ona zaimplementowana jako zestaw widoków, ale zamiast tego zawiera tabele podstawowe. Czy to założenie jest prawidłowe? Czy istnieją inne tabele systemowe, które są ukryte przed użytkownikiem?

Ivotron
źródło
Wielkie dzięki za +1 :) Ostatnie wyjaśnienie. Po tym, co powiedziałeś, czy słuszne jest stwierdzenie, że informacje o metadanych są odczytywane bezpośrednio z rzeczywistych plików .frm odpowiadających tabelom, które faktycznie się zmaterializowały? Więc kiedy serwer się uruchamia, odczytuje te informacje z tabel i tworzy SYSTEM INFORMACYJNY. Następnie, jeśli wykonywana jest TABELA ANALIZOWA lub UTWÓRZ INDEKS lub ogólnie dowolna instrukcja DDL, INFORMACJA_SCHEMA jest odpowiednio aktualizowana?
ivotron
@ivotron: To prawda !!! W tabeli INFORMACJE_SCHEMA znajdują się tabele, które rejestrują zmiany schematu, takie jak KOLUMNY, STATYSTYKA, KONTRAINY TABELI itd. Ponieważ INFORMACJE_SCHEMA jest cały w pamięci, rejestrowanie wszystkich zmian DDL jest prawie natychmiastowe.
RolandoMySQLDBA

Odpowiedzi:

30

Baza danych INFORMACJE_SCHEMA składa się z tabel tymczasowych przy użyciu silnika pamięci MEMORY.

Przykład: Oto tabela INFORMACJE_SCHEMA.TABLES w MySQL 5.5.12 (wersja 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)

Dla tych tabel nie ma fizycznego folderu, nawet plików .frm. Nie możesz tego mysqldump. Nie możesz tego upuścić. Nie można do niego dodawać tabel. Nie można z niego usuwać tabel. Gdzie są stoły ???

Wszystkie tabele w bazie danych INFORMACJE_SCHEMA są przechowywane bezpośrednio w pamięci jako tabele silnika pamięci MEMORY. Są całkowicie wewnętrzne dla MySQL, więc mechanizmy .frm są obsługiwane w mysqld. W mojej odpowiedzi najpierw pokazałem układ tabeli INFORMACJE_SCHEMA.TABLES. Jest to tymczasowy stół w pamięci. Manipuluje się nim za pomocą protokołów silnika pamięci masowej. Tak więc, gdy mysqld jest zamykany, wszystkie tabele schematu informacji są usuwane. Po uruchomieniu mysqld wszystkie tabele schematu informacyjnego są tworzone jako tabele TEMPORARY i ponownie wypełniane metadanymi dla każdej tabeli w instancji mysql.

Baza danych INFORMACJE_SCHEMA została po raz pierwszy wprowadzona w MySQL 5.0, aby dać ci dostęp do metadanych dotyczących tabel innych silników pamięci masowej. Na przykład możesz wykonać POKAŻ BAZY DANYCH, aby uzyskać listę baz danych. Możesz również zapytać o nie w ten sposób:

SELECT schema_name database FROM information_schema.schemata;

Nazwy tabel można pobrać z bazy danych na dwa sposoby:

use mydb
show tables;

lub

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

Od samego początku MySQL rozszerzył bazę danych INFORMACJE_SCHEMA o listę procesów (od MySQL 5.1). W rzeczywistości możesz przeszukiwać listę procesów w poszukiwaniu długo działających zapytań, które nadal działają przez co najmniej 10 minut:

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

Możesz użyć INFORMACJE_SCHEMA, aby wykonać wszystkie skomplikowane rzeczy: na przykład:

Uzyskaj liczby wszystkich tabel za pomocą określonych silników pamięci:

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;

Uzyskaj zalecany rozmiar bufora kluczy MyISAM w 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;

Uzyskaj zalecaną wielkość puli buforów InnoDB w 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;

Uzyskaj wykorzystanie dysku wszystkich baz danych przez Storage Engine w 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;

Uwierz mi, jest jeszcze więcej cudownych zastosowań dla Information_SCHEMA, że czas nie pozwala mi na dalsze omawianie.

Należy pamiętać, że INFORMACJE_SCHEMA jest tak wrażliwy, że jeśli mysql jest uruchomiony i wykonujesz następujące czynności:

cd /var/lib/mysql
mkdir junkfolder

a następnie przejdź do mysql run

mysql> SHOW DATABASES;

Junkfolder zobaczysz jako jedną z baz danych.

Wiedza o tym jest bardzo ważna dla DBA i programistów. Rozdział 20 (programiści) i rozdział 31 (DBA) książki MySQL 5.0 Certification Study Guide

wprowadź opis zdjęcia tutaj

są przygotowani do egzaminów certyfikacyjnych dla programistów i DBA. Zdobądź książkę, dobrze przestudiuj te rozdziały, a możesz robić wspaniałe rzeczy za pomocą INFORMACJE_SCHEMA MySQL.

Baza danych INFORMACJE_SCHEMA od MySQL 5.5 zawiera teraz wtyczki, zmienne globalne (status i statyczne), zmienne sesji (status i statyczne), status silnika pamięci, instrumentację wskaźników wydajności, mapę wyzwalaczy, zdarzenia (programowalne) i wiele więcej.

Niestety może to wyglądać jak WTMI, ale jestem wielkim zwolennikiem korzystania z bazy danych INFORMACJE_SCHEMA.

RolandoMySQLDBA
źródło