文章主要介绍了同事幺加明对Elasticsearch(ES)和MySQL进行大数据量测试的情况。测试包括数据模型定义、测试数据量及条件、查询条件等。通过对比测试,文章发现在合适的索引条件下,MySQL的查询速度明显优于ES。文章还探讨了ES的底层查询原理,并强调了根据具体需求选择合适的数据库技术的重要性。
介绍ES的数据模型,测试数据量达到2000万的作品数和5000的用户量,实际用户量应至少20万。在特定查询场景下,测试了不同权限类型的查询性能。
介绍MySQL的表结构,测试数据量为1000万的作品数据,总共1.5亿权限相关数据。测试了不同权限类型的查询性能,并强调合适索引的重要性。
在特定查询场景下,MySQL的查询性能明显优于ES。文章还探讨了ES的底层查询原理,并强调了根据具体需求选择合适的数据库技术的重要性。
在进行数据查询性能测试的过程中,我的同事幺加明对 ES(Elasticsearch)和 MySQL 进行了相对较大数据量的测试,并整理了相关结果。在得到其授权的情况下,我将此对比案例分享给大家,在此再次向幺加明表示感谢。
一、结论
通过对es和mysql相对较大数据量的测试,得出结果:在Mysql查询使用到合适的索引的条件下,通过mysql得到相应结果的速度要明显优于Es。
二、通过es实现
unset
unset
Es 文档数据模型:
unset
unset
type Content struct {
ContentId int64 `json:"id"` // 内容id
PermissionType int `json:"permission_type"` // 权限类型 0:公开,1:仅自己可见,2:部分可见,3:不给谁看
TopicId int `json:"topic_id"` // 话题id
AllowUser []User `json:"allow_user"` // 允许的用户
BlockUser []User `json:"block_user"` // 屏蔽的用户
}
type User struct {
Id int64 `json:"id"` // 用户id
}
unset
unset
测试数据量及条件
unset
unset
测试 ES 数据量为 2000 万的作品数,5000 的用户量(此用户量与实际情况有出入,理论上应有至少 20 万的用户量)。
当设置给部分人可见时,AllowUser 内有 30 个元素;同样,当设置不给谁看时,BlockUser 内也是有 30 个元素。所以对应的总数据量在 3 亿条左右。
unset
unset
查询条件如下:
unset
unset
1、单独查询公开可见数据:查询时间在275毫秒左右
2、单独查询部分可见数据:耗时70毫秒左右
3、单独查询部分不可见数据:耗时255毫秒左右
4、合并三次查询未一次查询就得到结果的话:耗时428毫秒左右
综上所述 采用 Es最快的响应时间为并行执行每次查询,耗时在300毫秒以内。
三、通过mysql实现
unset
unset
Mysql 表结构如下:
unset
unset
CREATE TABLE `content_permission_1` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`content_id` int NOT NULL DEFAULT '0' COMMENT '内容id',
`permission_type` tinyint NOT NULL DEFAULT '0' COMMENT '权限类型 0:公开,1:仅自己可见,2:部分可见,3:不给谁看 ',
`topic_id` int NOT NULL DEFAULT '0' COMMENT '话题id',
`user_id` int NOT NULL DEFAULT '0' COMMENT '权限针对的用户id',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_content_id` (`content_id`) USING BTREE,
KEY `idx_user_id_content_id` (`user_id`,`content_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='内容权限表(可见设置)'
unset
unset
测试条件及数据量
unset
unset
测试 MySQL 数据量为 1000 万的作品数据,总共 1.5 亿权限相关数据。
unset
unset
查询条件如下:
unset
unset
1、查询公开数据:耗时21毫秒左右;使用到的索引为
idx_content_id
2、查询部分人可见:耗时48毫秒左右;使用到的索引为
idx_user_id_content_id
3、查询部分人不可见:耗时13毫秒左右;使用到的索引为
idx_content_id
综上所述 采用 mysql最快的响应时间为并行执行每次查询,耗时在50毫秒以内