Як реалізується INFORMATION_SCHEMA в MySQL?


14

Теоретично INFORMATION_SCHEMA - це набір поглядів, визначений у стандарті SQL, що дозволяє користувачеві перевіряти метадані системи. Як це реалізовано в MySQL?

Під час підключення до нової установки я бачу дві бази даних: mysqlі information_schema. Після використання SHOW CREATE TABLEвисловлювань у information_schemaбазі даних схоже, що вона не реалізована як набір поглядів, а замість базових таблиць. Чи правильне це припущення? Або є інші системні таблиці, які приховані від користувача?


Дякую за +1 :) Одне останнє уточнення. Після сказаного, чи правильно стверджувати, що інформація метаданих зчитується безпосередньо з фактичних .frm-файлів, відповідних таблицям, які фактично матеріалізуються? Отже, коли сервер завантажується, він зчитує цю інформацію з таблиць і створює INFORMATION_SCHEMA. Тоді якщо виконано ANALYZE TABLE або CREATE INDEX або взагалі будь-який оператор DDL, INFORMATION_SCHEMA буде оновлено відповідно?
ivotron

@ivotron: Це правильно !!! У INFORMATION_SCHEMA є таблиці, які записують зміни схеми, такі як COLUMNS, STATISTICS, TABLE_CONSTRAINTS тощо. Оскільки INFORMATION_SCHEMA весь в пам'яті, запис усіх змін DDL майже миттєвий.
RolandoMySQLDBA

Відповіді:


30

База даних INFORMATION_SCHEMA складається з тимчасових таблиць, що використовують механізм запам'ятовування MEMORY.

Приклад: Ось таблиця INFORMATION_SCHEMA.TABLES в MySQL 5.5.12 (версія 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)

Для цих таблиць немає фізичної папки, навіть файлів .frm. Ви не можете міслдамп. Ви не можете скинути його. Ви не можете додати таблиці до нього. Ви не можете скидати з нього таблиці. Отже, де столи ???

Всі таблиці в базі даних INFORMATION_SCHEMA зберігаються безпосередньо в пам'яті як таблиці пам'яті MEMORY. Вони повністю внутрішні для MySQL, тому механізми .frm обробляються в mysqld. У своїй відповіді я вперше показав макет таблиці INFORMATION_SCHEMA.TABLES. Це тимчасова таблиця пам’яті. Це маніпулює використанням протоколів двигуна зберігання. Таким чином, при відключенні mysqld усі таблиці інформації_схеми випадають. Коли запускається mysqld, усі таблиці information_schema створюються у вигляді TEMPORARY таблиць та переповнені метаданими для кожної таблиці в екземплярі mysql.

База даних INFORMATION_SCHEMA була вперше представлена ​​в MySQL 5.0 для надання доступу до метаданих про таблиці інших двигунів зберігання даних. Наприклад, ви могли б зробити SHOW DATABASES, щоб отримати список баз даних. Ви також можете запитувати їх так:

SELECT schema_name database FROM information_schema.schemata;

Ви можете отримати імена таблиць у базі даних двома способами:

use mydb
show tables;

або

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

З моменту створення MySQL розширив базу даних INFORMATION_SCHEMA, щоб мати список процесів (станом на MySQL 5.1). Ви можете фактично запитувати список процесів, шукаючи тривалі запити, які все ще працюють принаймні 10 хвилин:

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

Ви можете використовувати INFORMATION_SCHEMA, щоб робити всі складні речі: наприклад:

Отримайте підрахунок усіх таблиць за допомогою певних двигунів зберігання:

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;

Отримайте рекомендований розмір буфера для ключа MyISAM в МБ

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;

Отримайте рекомендований розмір пулу InnoDB в ГБ

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;

Отримайте дискове використання всіх баз даних за допомогою механізму зберігання даних у МБ

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;

Повірте, для INFORMATION_SCHEMA є ще чудові користі, які час не дозволяють мені далі обговорювати.

Зауважте, що INFORMATION_SCHEMA настільки чутливий, що якщо функція mysql запущена, ви зробите наступне:

cd /var/lib/mysql
mkdir junkfolder

а потім перейти до mysql run

mysql> SHOW DATABASES;

Ви побачите небажану папку як одну з баз даних.

Знаючи це, дуже важливо для DBA та розробників. Глава 20 (розробники) та глава 31 (DBA) книги MySQL 5.0 Certification Study Guide

введіть тут опис зображення

є для підготовки до іспитів для розробників та сертифікатів DBA. Отримайте книгу, добре вивчіть ці глави, і ви можете зробити чудові речі з INFORMATION_SCHEMA MySQL.

База даних INFORMATION_SCHEMA, як MySQL 5.5, тепер містить плагіни, глобальні змінні (статус і статичні), змінні сеансу (статус і статичність), стан механізму зберігання даних, інструментарій метрики продуктивності, тригерну карту, події (програмовані) та багато іншого.

Вибачте, це може здатися WTMI, але я великий прихильник використання бази даних INFORMATION_SCHEMA.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.