你到底需不需要使用数据库表压缩?

数据库压缩消耗时间及空间对比和事物提交实验

 

实验结果:

压缩插入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("结束");
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ah_ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值