1. 什么是元數據表
元數據:數據的數據,用以描述數據的信息也是數據,被稱為元數據
2. 獲取元數據的方法
MySQL提供了以下三種方法用于獲取數據庫對象的元數據:
show語句
從INFORMATION_SCHEMA數據庫里查詢相關表(information_schema是一個虛擬數據庫,并不物理存在,它儲存數據的信息的數據庫)
命令行程序,如mysqlshow, mysqldump
3. SHOW語句獲取元數據
語句 | 作用 |
---|---|
show databases | 列出所有數據庫 |
show create database db_name | 查看數據庫的DDL |
show tables | 列出默認數據庫的所有表 |
show tables from db_name | 列出指定數據庫的所有表 |
show table status | 查看表的描述性信息 |
show table status from db_name | 查看表的描述性信息 |
show create table tbl_name | 查看表的DDL |
show columns from tbl_name | 查看列信息 |
show index from tbl_name | 查看索引信息 |
?
示例:
有幾種show語句還可以帶有一條like 'pattern'字句,用來限制語句的輸出范圍,其中'pattern'允許包含'%'和'_'通配符,比如下面這條語句返回domaininfo表中以s開頭的所有列:
SHOW COLUMNS FROM t_student LIKE 's%'; ?(EXPLAIN t_student;)
? ? ?2.查看表的描述信息
SHOW TABLE STATUS FROM test LIKE 't_student'
Name * 作用:顯示表的名稱。這是用于唯一標識數據庫中的每個表,通過表名可以在后續的查詢、修改等操作中準確地引用該表 * 示例:如果有一個名為
customers
的表,在SHOW TABLE STATUS
的結果中,Name
列會顯示customers
,可以通過這個名稱來明確是針對哪個表的信息Engine
作用:表示表所使用的存儲引擎。常見的存儲引擎有 InnoDB、MyISAM 等。不同的存儲引擎具有不同的特性,例如 InnoDB 支持事務處理和外鍵約束,而 MyISAM 在一些簡單的讀寫場景下可能具有更高的性能。
示例:若
Engine
列顯示為InnoDB
,說明該表使用 InnoDB 存儲引擎,這意味著在這個表上可以進行事務操作,如使用START TRANSACTION
、COMMIT
和ROLLBACK
語句來控制數據的一致性
Version
作用:存儲表的版本信息。這個版本信息通常是由 MySQL 內部用于管理表結構的更新和變化等情況,一般用戶很少直接使用這個列的值
示例:在 MySQL 進行表結構升級等操作時,
Version
列的值可能會發生改變,以記錄表的更新次數或版本號等相關信息
Row_format
作用:指定表中行的存儲格式。常見的行格式有 Compact、Dynamic 等。不同的行格式在存儲效率和數據處理方式上有所不同。例如,Compact 格式對于存儲空間的利用較為高效,而 Dynamic 格式在處理可變長度列較多的情況下可能更靈活
示例:如果
Row_format
列顯示為Compact
,說明該表的行采用 Compact 格式存儲,這種格式會對數據進行緊湊的存儲,減少存儲空間的占用,特別是對于包含變長字段(如 VARCHAR 類型)的表
Rows
作用:這是一個估計值,表示表中的行數。需要注意的是,這個值可能不是完全精確的,尤其是在對表進行頻繁的插入、刪除等操作后,MySQL 可能沒有及時更新這個估計值
示例:如果
Rows
列顯示為1000
,這大致表示該表中可能有 1000 行數據。可以用這個值來初步了解表的規模,例如在對數據量較大的表進行查詢優化時,會考慮這個因素
Avg_row_length
作用:計算表中平均每行的長度(字節數)。這個值是通過表的總字節數除以估計的行數得到的。它可以幫助你了解數據在表中的存儲密度等信息
示例:如果
Avg_row_length
列顯示為100
字節,且Rows
列顯示為1000
,那么可以大致估計出該表占用的存儲空間約為100×1000 = 100000
字節
Data_length
作用:表示表的數據部分的長度(字節數),即存儲表中實際數據所占用的空間大小。這個值不包括索引等其他部分的存儲空間
示例:若
Data_length
列顯示為50000
字節,這就是表中數據本身占用的空間大小,可以用來評估數據存儲的規模和效率
Max_data_length
作用:指定表所能容納的最大數據長度(字節數)。這個限制取決于表的存儲引擎和配置等因素。例如,對于某些存儲引擎,這個值可能受到文件系統的文件大小限制或者存儲引擎本身的內部限制
示例:如果
Max_data_length
列顯示為1073741824
字節(1GB),這表示在當前存儲引擎和配置下,該表最多可以存儲 1GB 的數據部分,超過這個限制可能需要考慮對表進行優化或者擴展存儲
Index_length
作用:表示表中索引部分的長度(字節數)。索引是用于提高查詢速度的一種數據結構,這個列的值可以幫助你了解索引占用的存儲空間情況
示例:若
Index_length
列顯示為20000
字節,這說明表的索引總共占用了 20000 字節的存儲空間。可以通過這個值與數據長度等進行比較,來評估索引的規模是否合理
Data_free
作用:顯示表中已經分配但目前尚未使用的空間(字節數)。這部分空間可以用于后續的數據插入等操作,直到用完后可能需要重新分配空間
示例:如果
Data_free
列顯示為1000
字節,這表示表中有 1000 字節的空間已經分配但還沒有被數據占用,可以用于存儲新插入的數據
Auto_increment
作用:如果表中有一個自增列(通常是一個整數類型的主鍵),這個列會顯示自增列的下一個可用值。它用于自動為新插入的行生成唯一的標識符
示例:假設表中有一個名為
id
的自增主鍵列,Auto_increment
列顯示為101
,這意味著下一次插入新行時,id
列的值將自動設置為 101
Create_time
作用:記錄表的創建時間。這個時間戳可以幫助你了解表的歷史,例如在進行數據庫備份策略或者數據遷移計劃時,可以參考這個時間來確定表的新舊程度
示例:如果
Create_time
列顯示為2024-01-01 10:00:00
,這表示該表是在 2024 年 1 月 1 日 10 點創建的
Update_time
作用:表示表的最后更新時間。這個更新可能是因為數據的插入、刪除或者修改等操作導致的。通過這個時間可以了解表中數據的活躍度
示例:若
Update_time
列顯示為2024-02-01 14:00:00
,這意味著表中的數據最后一次更新是在 2024 年 2 月 1 日 14 點,可以用來判斷數據是否是最新的,或者是否需要重新緩存表的數據等
Check_time
作用:用于存儲表最后一次檢查(如完整性檢查)的時間。這個功能在一些存儲引擎(如 MyISAM)中有更明顯的體現,對于維護表的數據質量很重要
示例:在 MyISAM 存儲引擎下,如果
Check_time
列顯示為2024-03-01 16:00:00
,這表示該表最后一次完整性檢查是在 2024 年 3 月 1 日 16 點
Collation
作用:指定表所使用的字符集校對規則。字符集校對規則決定了字符的比較和排序方式。例如,
utf8_general_ci
是一種常用的校對規則,其中ci
表示不區分大小寫示例:如果
Collation
列顯示為utf8_general_ci
,說明在這個表中,字符數據(如 VARCHAR 類型的列)在進行比較和排序操作時,會按照不區分大小寫的utf8
字符集規則來執行
Checksum
作用:存儲表的校驗和信息(如果有的話)。校驗和用于驗證表數據的完整性,不過并不是所有的存儲引擎都支持或者啟用這個功能
示例:對于支持校驗和的存儲引擎,在數據完整性檢查等操作中,可以參考
Checksum
列的值來判斷數據是否被篡改或者損壞
Create_options
作用:顯示創建表時使用的額外選項。這些選項可能包括存儲引擎特定的設置、表的分區設置等其他特殊的配置信息
示例:如果表是分區表,
Create_options
列可能會顯示分區的相關信息,如分區的類型(范圍分區、列表分區等)和分區的表達式等內容
Comment
作用:可以用于存儲對表的注釋信息。這是一個自定義的字段,開發人員或者數據庫管理員可以在這里添加對表的功能、用途等方面的說明
示例:如果在創建表時添加了注釋,如
COMMENT = 'This table stores customer information'
,那么在SHOW TABLE STATUS
的Comment
列就會顯示This table stores customer information
4. INFORMATION_SCHEMA查詢相關表
INFORMATION_SCHEMA是MySQL自帶的一個系統數據庫,它里面存儲了所有的元數據,通過select里面的相關表就可以獲取你想要的元數據。和show語句相比,它比較麻煩,但它的好處是標準的SQL語句,更具有可移植性,且更靈活,可以通過各種表達式獲取你真正需要的信息。information_schema是一個虛擬數據庫,并不物理存在,在select的時候,從其他數據庫獲取相應的信息
以下的語句可以查出超過1000行數據的表
?SELECT CONCAT(table_schema,'.',table_name) AS table_name,table_rows ?
FROM information_schema.tables?
WHERE table_rows > 1000?
ORDER BY table_rows DESC;?
?
查詢所有沒有主鍵的表 ?
SELECT CONCAT(t.table_name,".",t.table_schema) AS table_name ?
FROM information_schema.TABLES t ?
LEFT JOIN information_schema.TABLE_CONSTRAINTS tc ?
ON t.table_schema = tc.table_schema ?
AND t.table_name = tc.table_name ?
AND tc.constraint_type = 'PRIMARY KEY' ?
WHERE tc.constraint_name IS NULL ?
AND t.table_type = 'BASE TABLE';??
?
查詢5個最大表 ?
SELECT?
TABLE_NAME,
CONCAT(ROUND((DATA_LENGTH + INDEX_LENGTH)/(1024*1024),2),'MB') AS total_size
FROM?
information_schema.TABLES
WHERE?
TABLE_SCHEMA = 'mysql' ?-- 將'your_database_name'替換為實際的數據庫名
ORDER BY?
total_size DESC
LIMIT 5;?
獲取指定數據庫占用的磁盤空間 ?
SELECT CONCAT(ROUND(SUM(DATA_LENGTH + INDEX_LENGTH)/(1024*1024), 2), 'MB') AS database_size
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'test';?