数据库压缩消耗时间及空间对比和事物提交实验
实验结果:
压缩插入10000条时间:默认是一条数据一个事物:246427
所有数据用一个事物提交: 923
普通插入10000条时间:默认是一条数据一个事物:348264
所有数据用一个事物提交: 826
压缩插入1000条时间:默认是一条数据一个事物:13700 13679 13296 15487
所有数据用一个事物提交: 174 188 171 173
普通插入1000条时间:默认是一条数据一个事物:14026 13672 13597 14444
所有数据用一个事物提交: 161 170 178 177
两表结构完全相同,写入数据完全相同,一共写入4w条数据
使用压缩,磁盘占用 1.26M
不使用压缩,磁盘占用 2.52M
通过测试得出如下结论:
① 数据库表压缩,对写入数据的速度提升并不明显,由于测试平台是win10系统,而且磁盘再写入过程中一直是满载状态,此结论范围有一定局限性,但是应该差不多。
② 数据库表压缩过程肯定会使用mysql的数据压缩算法,一定会有额外的开支,但是我们得到的好处是磁盘的利用率会更高。
③ 查询,我们用到的不多,有可能猜测效率应该不会有多大的提升。
④ 数据库表压缩可以大大提高磁盘利用率,不过暂时看起来磁盘应该够用,而且磁盘的成本不是很高。
⑤ 通过实验可以看出,用一个事物提交一次的数据,写入效率可以大大提高,但是会增加风险,原本可能因为某些原因丢失一个数据,却因为事物导致丢失了这次提交的所有数据
实验中相关代码如下:
创建表sql如下:
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `mt_searchhistory_2017_10`;
CREATE TABLE `mt_searchhistory_2017_10` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`number` varchar(4) NOT NULL,
`value` varchar(32) NOT NULL,
`date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ROW_FORMAT=COMPRESSED ENGINE=InnoDB AUTO_INCREMENT=720887 DEFAULT CHARSET=utf8;
//ROW_FORMAT=COMPRESSED//自动压缩
Java 测试代码如下:
/**
* 数据库工具类
*
* @author ALGSH
*
*/
public class DBHepler {
/**
* 常量
*/
public static final String url = "jdbc:mysql://localhost:3306/compress";
public static final String name = "com.mysql.jdbc.Driver";
public static final String user = "root";
public static final String password = "admin";
private Connection conn = null;
private PreparedStatement pst = null;
public DBHepler() {
try {
Class.forName(name);// 指定连接类型
conn = DriverManager.getConnection(url, user, password);// 获取连接
conn.setAutoCommit(false);// 更改JDBC事务的默认提交方式,手动提交
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 执行sql语句
*
* @param sql
*/
public void runSql(String sql) {
try {
pst = conn.prepareStatement(sql);
pst.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 准备执行语句
}
/**
* 关闭所有
*/
public void close() {
try {
this.conn.commit();// 提交JDBC事务
this.conn.close();
this.pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
*主函数:
*/
public class Main {
public static void main(String[] args) {
DBHepler dbHepler = new DBHepler();
try {
/*********************** 插入 ***********************/
String number = "1";
String value = "6666666666";
String sql = "insert into mt_searchhistory_2017_10 (number,value,date) values (" + number + "," + value
+ ",current_timestamp())";
Long tStart = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
dbHepler.runSql(sql);
}
Long tEnd = System.currentTimeMillis();
System.out.println("\n");
System.out.println(tEnd - tStart);
} catch (Exception e) {
e.printStackTrace();
} finally {
dbHepler.close();
}
System.out.println("结束");
}
}