由于编程思想与数据库的设计模式不同,生出了一些 ORM 框架。核心都是将关系型数据库和数据转成对象型。当前流行的方案有 Hibernate 与 myBatis。两者各有优劣。竞争激烈,其中一个比较重要的考虑的地方就是性能。因此笔者通过各种实验,测出两个在相同情景下的性能相关的指数,供大家参考。
测试目标
以下测试需要确定几点内容:性能差异的场景;性能不在同场景下差异比;找出各架框优劣,各种情况下的表现,适用场景。
测试思路
测试总体分成:单表插入,关联插入,单表查询,多表查询。测试分两轮,同场景下默认参数做一轮,调优做强一轮,横纵对比分析了。测试中尽保证输入输出的一致性。样本量尽可能大,达到 10 万级别以上,减少统计误差。
测试提纲
具体的场景情况下插入测试 1:10 万条记录插入。查询测试 1:100 万数据中单表通过 id 查询 100000 次,无关联字段。查询测试 2:100 万数据中单表通过 id 查询 100000 次,输出关联对象字段。查询测试 3:100 万*50 万关联数据中查询 100000 次,两者输出相同字段。
准备
数据库:mysql 5.6 表格设计:twitter:推特
CREATE TABLE `twitter` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`add_date` datetime DEFAULT NULL,
`modify_date` datetime DEFAULT NULL,
`ctx` varchar(255) NOT NULL,
`add_user_id` bigint(20) DEFAULT NULL,
`modify_user_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `UPDATE_USER_FORI` (`modify_user_id`),
KEY `ADD_USER_FORI` (`add_user_id`),
CONSTRAINT `ADD_USER_FORI` FOREIGN KEY (`add_user_id`) REFERENCES `user` (`id`) ON DELETE SET NULL,
CONSTRAINT `UPDATE_USER_FORI` FOREIGN KEY (`modify_user_id`) REFERENCES `user` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=1048561 DEFAULT CHARSET=utf8
复制代码
user: 用户
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=524281 DEFAULT CHARSET=utf8
复制代码
测试数据准备:
表一:twitter
无数据。
表二:user
50 万个随机的用户名。
随机内容推特表(material_twitter)无 id,仅有随机字符串内容,共 10 万条。用于插入控推特表。
生成数据代码,关联 100 个用户:
insert into twitter(ctx,add_user_id,modify_user_id,add_date,modify_date)SELECT name,ROUND(RAND()*100)+1,ROUND(RAND()*100)+1,'2016-12-31','2016-12-31'from MATERIAL
生成数据代码,关联 500000 个用户ÿ