mysql查看数据库表大小、索引大小与表数量
假定要查的数据库名称是“xxxx_mall”
1、查看数据库数据占用大小
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from information_schema.TABLES where table_schema='xxxx_mall'
2、查看数据库索引占用大小
select concat(round(sum(INDEX_LENGTH/1024/1024),2),'MB') as data from information_schema.TABLES where table_schema='xxxx_mall'
3、查看数据库各个表的行数,索引大小,数据大小
select table_name,table_rows,concat(round((index_length)/1024/1024,2),'MB') index_data ,concat(round((data_length)/1024/1024,2),'MB') data_data
from information_schema.TABLES where table_schema='xxxx_mall'
4、查看各个数据库的表个数
select count(*) tables, table_schema from information_schema.tables group by table_schema
5、查看某个数据库的表及描述列表
select (@i :=@i + 1) AS '序号', table_name AS '表名' ,table_comment AS '表说明'from information_schema.tables,(SELECT @i := 0) AS inum where table_schema = 'XXXXX_DB'
6、mysql统计指定数据库的各表的条数
SELECT table_schema,table_name,table_rows,CREATE_TIME FROM TABLES WHERE TABLE_SCHEMA='cloud_**' ORDER BY table_rows DESC;
SELECT table_schema,table_name,table_rows,CREATE_TIME FROM TABLES WHERE TABLE_SCHEMA='db_name_xxxx' and table_name like 'tabe_name%' ORDER BY table_name DESC;备注:
(1)mysql会定期自动做统计信息的收集,每天一次,由参数
information_schema_stats_expiry
控制,参数 information_schema_stats_expiry 的值决定再次收集表的统计信息的时间间隔,默认 86400 秒。如果设置为 0 ,则表示实时更新统计信息,当然势必会影响一部分性能。 (2)想要精准一些,在统计前,做一下analyze table table_name;但是遇到超级大表,手工做一个analyze可能会卡很长时间。
当MySQL数据库做FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, or OPTIMIZE TABLE这些操作时,会导致需要关闭内存中的表,并重新打开表,加载新的表结构到内存中。但是关闭表,需要等待所有的在这个表上的操作执行结束(包括select,insert,update,lock table等),所以当有一个特别慢的select一直在执行时,analyze table命令就一直无法结束。
若遇到这种情况,需要定位哪个慢sql导致的,并且kill掉才行。查询语句 : select * from processlist where info like ‘%表名%’ and time>=(select time from processlist where id=‘analyze操作的进程号’) order by time desc;
因此,生产库上执行analyze table建议:
(a)、执行之前,先估算一下表的数据量,根据经验预估需要消耗的时间,同时查看是否有采集信息表的慢SQL,大事务在执行。
(b)、避免在业务高峰期执行analyze table进行统计信息采集。
(a)、执行之前,先估算一下表的数据量,根据经验预估需要消耗的时间,同时查看是否有采集信息表的慢SQL,大事务在执行。
(b)、避免在业务高峰期执行analyze table进行统计信息采集。
相关文章: