MySQL5.6开始可以使用独立表空间:MySQL5.6innodb_file_per_table=1#使用独立表空间,动态参数。(5.6默认OFF,5.7默认ON)

1、drop/truncatetable方式操作表空间能自动回收(磁盘空间)

1)、创建procedure,循环insert一定量数据 ##usetest ##dropprocedurepro1;
DELIMITER// createprocedurepro1() begin declareiint; seti=1; whilei<100000do insertintotest.cc(id,name)values(i,"aa"); seti=i+1; endwhile; end;//
2)、调用procedure: mysql>callpro1();

3)、查看表大小、数据量: selecttable_name,(data_length+index_length)/1024/1024astotal_mb,table_rows frominformation_schema.tableswheretable_schema='test'andtable_name='CC';
+------------+------------+------------+ |table_name|total_mb|table_rows| +------------+------------+------------+ |cc|3.51562500|100246| +------------+------------+------------+ 1rowinset(0.31sec)
4)、truncate清表: mysql>truncatetabletest.cc; QueryOK,0rowsaffected(0.73sec)
5)、再次查看表空间已经回收:
cc.ibd 由 11264KB 回收到96KB 。
mysql>selecttable_name,(data_length+index_length)/1024/1024astotal_mb,table_rows ->frominformation_schema.tableswheretable_schema='test'andtable_name='CC'; +------------+------------+------------+ |table_name|total_mb|table_rows| +------------+------------+------------+ |cc|0.01562500|0| +------------+------------+------------+ 1rowinset(0.00sec)
mysql>
mysql>selectversion(); +------------+ |version()| +------------+ |5.7.11-log| +------------+ 1rowinset(0.08sec)
mysql>
注:drop table test.cc ; 物理文件cc.ibd也会同时被删除。

2、独立表空间下,可以自定义表的存储位置,(有时将部分热表放在不同的磁盘可有效地提升IO性能)
createtabletest(idint)datadirectory='c:/software'; createtabletest1(idint,namevarchar(20),primarykey(id))datadirectory='c:/software';
3、独立表空间下,可以回收表空间碎片(比如一个非常大的delete操作之后释放的空间)
1)创建测试表
DELIMITER// createprocedurepro_test1() begin declareiint; seti=1; whilei<10000do insertintotest.test1(id,name)values(i,"aa"); seti=i+1; endwhile; end;//
##callpro_test1();

表大小:test1.ibd368KB

2)delete后表大小:mysql>deletefromtest1; test1.ibd384KB

3)回收表空间mysql>altertabletest1engine=innodb; test1.ibd96KB
mysql> selecttable_name,(data_length+index_length)/1024/1024astotal_mb,table_rows frominformation_schema.tableswheretable_schema='test'andtable_name='TEST1';
+------------+------------+------------+
| table_name | total_mb | table_rows |
+------------+------------+------------+
| test1 | 0.01562500 | 0 |
+------------+------------+------------+
1 row in set (0.00 sec)