話說生產環境的數據庫是不能本地直連的,所以公司一般都會提供一個比較簡陋的數據庫查詢頁面,在可控的范圍內,支持你提交一些查詢、變更SQL,滿足你的查庫功能。但是因為不能直接使用Navicat、DataGrip這些好用的數據庫客戶端,一些數據庫的基本信息獲取起來就比較麻煩了。比如你想看線上業務表都有哪些索引?是不是和測試環境不一致?這種情況應該怎么辦呢?
其實好辦!因為數據庫的各種基礎信息,都保存在INFORMATION_SCHEMA這個schema下了。INFORMATION_SCHEMA是MySQL自帶的數據庫,存儲了MySQL中各個數據庫的元數據。所以,只需要從INFORMATION_SCHEMA下的各個表里取數據,就可以獲取到數據庫的基本信息了
1、庫信息
庫信息存放在SCHEMATA表中,使用以下語句,即可查詢全部的庫信息。
select *
from INFORMATION_SCHEMA.SCHEMATA;
當然,你也可以用對應的show databases
命令來獲取庫信息,但是顯示的內容會更簡潔些,只會展示數據庫的名稱。
2、表信息
表信息存放在TABLES表中,使用以下語句,即可查詢全部的表信息。包括表名、數據量、自增值、行數等信息。
select *
from INFORMATION_SCHEMA.TABLES;
但是這么查詢,會查出所有schema下的表信息,所以加上查詢條件TABLE_SCHEMA = 'yourSchemaName'
就可以了。
當然,這個表的查詢也有對應的語句show tables from yourSchemaName
。只不過這個語句也只會展示當前庫下所有的表名,而且遠沒有直接從TABLES表里查詢的數據詳細。
3、列信息
列信息存放在COLUMNS表中,使用以下語句,即可查詢指定表的列信息。包括列名、數據類型、長度、是否為空等你創建表時的基本信息。
select *
from INFORMATION_SCHEMA.COLUMNS
where table_name = 'yourTableName';
對應的語句是show columns from yourTableName;
4、索引信息
索引信息存放在STATISTICS表中(很奇怪,為啥這個表不叫INDEX),使用以下語句,即可查詢指定表的索引信息。包含了索引名、索引的字段等。
select *
from INFORMATION_SCHEMA.STATISTICS
where table_name = 'yourTableName';
對應的命令是show index from yourTableName;
這個命令還是比較給力的,相比於前幾個命令,它列出了很詳細的索引信息。
優化后的SQL,建議收藏
好啦,其實INFORMATION_SCHEMA下的表還有很多,但是我認為平時最常用到的就是這四張表了。大家應該都已經知道了這四張表存放的信息和查詢方式,這里我優化了查詢SQL,讓大家可以在查詢的時候更直觀~
-- 查表
select TABLE_NAME as 表名,
ENGINE as 存儲引擎,
TABLE_ROWS as 行數,
AVG_ROW_LENGTH as 平均行大小,
DATA_LENGTH / 1024 / 1024 as 表數據大小(MB),
INDEX_LENGTH / 1024 / 1024 as 索引大小(MB),
AUTO_INCREMENT as 當前主鍵自增值,
TABLE_COMMENT as 表描述
from INFORMATION_SCHEMA.TABLES
where TABLE_SCHEMA = 'yourSchemaName';
-- 查列
SELECT COLUMN_NAME 列名,
COLUMN_TYPE 數據類型,
DATA_TYPE 字段類型,
CHARACTER_MAXIMUM_LENGTH 長度,
IS_NULLABLE 是否為空,
COLUMN_DEFAULT 默認值,
COLUMN_COMMENT 備注
FROM INFORMATION_SCHEMA.COLUMNS
where table_name = 'yourTableName';
-- 查索引
select INDEX_NAME as 索引名,
COLUMN_NAME as 索引中的字段名,
SEQ_IN_INDEX as 索引中的順序,
INDEX_TYPE as 索引類型
from INFORMATION_SCHEMA.STATISTICS
where table_name = 'yourTableName';