use information_schema;
select TABLE_ROWS, concat(round(sum(DATA_LENGTH/1024), 2),'KB') as totalSize, concat(round(sum(DATA_LENGTH/1024), 2),'KB')/TABLE_ROWS as recordSize from TABLES where table_schema='databaseName' and table_name='tableName';
說明:
MySQL的 information_schema 數據庫,保存着數據庫的容量和使用信息。可查詢數據庫中每個表佔用的空間、表記錄的行數。
Tables表的結構:
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(20) 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;
主要字段說明:
TABLE_SCHEMA : 數據庫名
TABLE_NAME:表名
ENGINE:所使用的存儲引擎
TABLE_ROWS:記錄數
DATA_LENGTH:數據大小
INDEX_LENGTH:索引大小
計算出數據表中每行記錄佔用空間的目的是什麼呢?目的是知道該表在保證查詢性能的前提下,單表能存儲的行記錄的上限。參考博客3中提到一個假設:假設一行記錄的數據大小爲1k,實際上現在很多互聯網業務數據記錄大小通常就是1K左右。在這個假設下得出結論爲單表B+樹索引層級爲3層時,能存儲的行記錄上限爲21,902,400。
由此可知,一張表在保證查詢性能的前提下,能存儲的記錄行數與每行記錄的大小有關。本人通過對互聯網業務數據進行統計發現,單行記錄數據的大小超過1k的並不太多,單行記錄的平均大小不到0.5k(0.5k左右),也就是說,能存儲的行記錄上限在四千萬~五千萬。
參考博客:
1.https://www.jianshu.com/p/8f086c98d591 mysql查詢庫大小,錶行數,索引大小
2.https://www.cnblogs.com/mr-wuxiansheng/p/7520628.html msyql round函數
3.https://blog.csdn.net/Saintyyu/article/details/100114372 爲什麼MySQL的索引要使用B+樹,而不是其它樹?比如B樹?