База даних 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.