INFORMATION_SCHEMAฐานข้อมูลถูกสร้างขึ้นจากตารางชั่วคราวโดยใช้เครื่องมือการจัดเก็บหน่วยความจำ
ตัวอย่าง: นี่คือตาราง 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 คุณไม่สามารถ mysqldump คุณไม่สามารถวางได้ คุณไม่สามารถเพิ่มตารางเข้าไปได้ คุณไม่สามารถวางตารางจากมัน ดังนั้นตารางอยู่ที่ไหน ???
ตารางทั้งหมดในฐานข้อมูล INFORMATION_SCHEMA จะถูกเก็บไว้ในหน่วยความจำโดยตรงเป็นตารางเอนจินการเก็บข้อมูล MEMORY พวกมันทั้งหมดภายใน MySQL ดังนั้นกลไก. frm ถูกจัดการใน mysqld ในคำตอบของฉันฉันแรกแสดงเค้าโครงตารางของ INFORMATION_SCHEMA.TABLES มันเป็นตารางชั่วคราวในหน่วยความจำ มันถูกจัดการโดยใช้โปรโตคอลเอ็นจิ้นการจัดเก็บ ดังนั้นเมื่อ mysqld ปิดตัวลงตาราง data_schema ทั้งหมดจะถูกดร็อป เมื่อเริ่ม mysqld ตาราง data_schema ทั้งหมดจะถูกสร้างเป็นตารางชั่วคราวและ repopulated ด้วย metadata สำหรับทุกตารางในอินสแตนซ์ 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 ที่แนะนำเป็น 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;
รับขนาดบัฟเฟอร์ InnoDB ที่แนะนำเป็น 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;
รับการใช้งานดิสก์ของฐานข้อมูลทั้งหมดโดยเครื่องมือจัดเก็บข้อมูลเป็น 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;
เชื่อฉันยังคงมีการใช้ที่ยอดเยี่ยมกว่านี้สำหรับ Information_SCHEMA ในเวลานั้นไม่อนุญาตให้ฉันพูดคุยเพิ่มเติม
โปรดทราบว่า INFORMATION_SCHEMA นั้นอ่อนไหวมากหาก mysql ทำงานอยู่และคุณทำสิ่งต่อไปนี้:
cd /var/lib/mysql
mkdir junkfolder
จากนั้นไปที่ mysql run
mysql> SHOW DATABASES;
คุณจะเห็นโฟลเดอร์ขยะเป็นหนึ่งในฐานข้อมูล
การรู้ว่ามันมีความสำคัญมากสำหรับ DBA และนักพัฒนา บทที่ 20 (นักพัฒนาซอฟต์แวร์) และบทที่ 31 (DBA) ของหนังสือคู่มือMySQL 5.0 คู่มือการศึกษา
มีการเตรียมการสำหรับนักพัฒนาและการสอบรับรอง DBA รับหนังสือศึกษาบทเหล่านั้นอย่างดีและคุณสามารถทำสิ่งที่ยอดเยี่ยมด้วย MySQL's INFORMATION_SCHEMA
ฐานข้อมูล INFORMATION_SCHEMA ตั้งแต่ MySQL 5.5 ตอนนี้มีปลั๊กอิน, ตัวแปรทั่วโลก (สถานะและสแตติก), ตัวแปรเซสชั่น (สถานะและสแตติก), สถานะของเครื่องมือจัดเก็บ, เครื่องมือวัดประสิทธิภาพ, แผนที่ทริกเกอร์, กิจกรรม (โปรแกรม) และอีกมากมาย
ขออภัยนี่อาจดูเหมือน WTMI แต่ฉันเป็นผู้สนับสนุนรายใหญ่ในการใช้ฐานข้อมูล INFORMATION_SCHEMA