查看每一个数据库的数据量(记录数,数据容量,索引容量)
select
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;
查看某一个数据库中每一张表的数据量,方法一(InnoDB存储引擎会导致数据不精确,可以使用方法二)
select
TABLE_NAME as '表名',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='数据库名(替换)'
group by TABLE_NAME
查看某一个数据库中每一张表的数据量,方法二
select
substring( GROUP_CONCAT(a.sf SEPARATOR ''),1,length(GROUP_CONCAT(a.sf SEPARATOR ''))-10) as sql_str
from
( select concat(
'select "',
TABLE_name ,
'", count(*) as row_num from ',
TABLE_SCHEMA,
'.',
TABLE_name,
' union all '
) as sf
from
information_schema.tables
where
TABLE_SCHEMA = '数据库名(替换)') a
来测试一下,首先先新建一个数据库,再数据库中导入几张表:
用的是db导入csv的方式
右键数据库——>导入工具——>点击下一步——>选择csv文件——>一直下一步就行了
这样数据就导入进去了
来看一下有多少数据
执行一下代码,查看一下test数据库中所有表的数据量
select
TABLE_NAME as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='test'
group by TABLE_NAME;
执行后发现table_rows的记录数和count出来的数量不等,为什么呢?
查找后发现,这和表的存储引擎有关系,当你使用的是InnoDB存储引擎时,如果你使用SHOW TABLE STATUS、或者使用select * from information_schema.tables、或者通过执行计划的ROW列等方式查询一张表的行数,那么你会发现统计出来的行数并不准确;如果是MyISAM存储引擎统计的行是精确的。
对于MyISAM这样的存储引擎,在内存中直接存储了每张表的行数,所以当你查询时可以快速返回,而对于InnoDB这样带事务存储引擎,如果也直接存储精确的行数是有问题的,因为多个事务可能同时发生,每个事务都可能影响计数,所以InnoDB不直接保存每张表的精确行数,而是给出一个近似值,可能与实际值相差 40% 到 50%。
我们修改一下表的存储引擎在进行测试一下:
这时,我们再来运行一下之前代码进行一下测试
select
TABLE_NAME as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='test'
group by TABLE_NAME;
可以看到,修改存储引擎为MyISAM后,table_rows的值就和count的值对上了。这确实证明了MyISAM存储引擎统计的行是精确的。
那如果存储引擎为InnoDB那该如何查呢,看来只能每张表都count了。
语句都是单一的,那只要吧表名拼接上去就可以了
于是有了以下语句
select
substring( GROUP_CONCAT(a.sf SEPARATOR ''),1,length(GROUP_CONCAT(a.sf SEPARATOR ''))-10) as sql_str
from
( select concat(
'select "',
TABLE_name ,
'", count(*) as row_num from ',
TABLE_SCHEMA,
'.',
TABLE_name,
' union all '
) as sf
from
information_schema.tables
where
TABLE_SCHEMA = 'test') a
拼接成每一张表都进行count,最后把他们union all起来
将拼接过后的sql执行以后发现,InnoDB存储引擎的表也能同样的查出来了