共计 1210 个字符,预计需要花费 4 分钟才能阅读完成。
1、查看数据库表的存储量
# 切换数据库
use information_schema;
# 查看库的数据量
select concat(round(sum(data_length/1024/1024),2),'MB') as '数据量' from information_schema.tables where table_schema='DB_Name';
# 查看指定库表数据量
SELECT concat(ROUND(SUM(data_length / 1024 / 1024), 2), 'MB') AS dataFROM information_schema.tablesWHERE table_schema = 'DB_Name' AND table_name = 'Table_Name';
# 查看库中所有表的数据量
SELECT table_schema AS '数据库', table_name AS '表名', table_rows AS '记录数',TRUNCATE(data_length / 1024 / 1024, 2) AS '数据容量 (MB)',TRUNCATE (index_length / 1024 / 1024, 2) AS '索引容量 (MB)'FROM information_schema.tablesWHERE table_schema = 'DB_Name'ORDER BY data_length DESC, index_length DESC;
# 查看数据路径
SHOW VARIABLES LIKE 'datadir';
# 查看表碎片空间
SELECT table_schema db, table_name, data_free,ENGINE FROM information_schema.TABLES WHERE table_schema NOT IN ('information_schema', 'mysql') AND data_free > 0;
# 优化表空间
alter table table_name engine=innodb;(本质上是 recreate)
optimize table table_name;(本质上是 recreate,但是在不同创建下会有区别)
ALTER TABLE table_name FORCE (在 InnoDB 表中等价于 alter table tb_test engine=innodb;)
mysqlcheck 批量表空间优化
gh-ost/pt-osc
pt-online-schema-change(本质上也是 先备份旧表数据,然后 truncate 旧表)

2、快速复制 / 合并 数据
# 快速在同一数据库中复制一个表的结构和索引定义
create table 新表 like 原表 ;
# 将原表中的所有数据插入到新表中,必须保证新表和原表的结构完全相同
insert into 新表 select *from 原表 ;
# 自建 MySQL 可以使用,创建新表并从原表中复制数据的 SQL 语句:
create table 新表 engine=innodb as select * from 原表;
正文完