在进行数据查询性能测试的过程中,我的同事幺加明对 ES(Elasticsearch)和 MySQL 进行了相对较大数据量的测试,并整理了相关结果。在得到其授权的情况下,我将此对比案例分享给大家,在此再次向幺加明表示感谢。
一、结论
通过对es和mysql相对较大数据量的测试,得出结果:在Mysql查询使用到合适的索引的条件下,通过mysql得到相应结果的速度要明显优于Es。
二、通过es实现
unsetunsetEs 文档数据模型:unsetunset
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
}
unsetunset测试数据量及条件unsetunset
测试 ES 数据量为 2000 万的作品数,5000 的用户量(此用户量与实际情况有出入,理论上应有至少 20 万的用户量)。
当设置给部分人可见时,AllowUser 内有 30 个元素;同样,当设置不给谁看时,BlockUser 内也是有 30 个元素。所以对应的总数据量在 3 亿条左右。
unsetunset查询条件如下:unsetunset
1、单独查询公开可见数据:查询时间在275毫秒左右
2、单独查询部分可见数据:耗时70毫秒左右
3、单独查询部分不可见数据:耗时255毫秒左右
4、合并三次查询未一次查询就得到结果的话:耗时428毫秒左右
综上所述 采用 Es最快的响应时间为并行执行每次查询,耗时在300毫秒以内。
三、通过mysql实现
unsetunsetMysql 表结构如下:unsetunset
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='内容权限表(可见设置)'
unsetunset测试条件及数据量unsetunset
测试 MySQL 数据量为 1000 万的作品数据,总共 1.5 亿权限相关数据。
unsetunset查询条件如下:unsetunset
1、查询公开数据:耗时21毫秒左右;使用到的索引为 idx_content_id
2、查询部分人可见:耗时48毫秒左右;使用到的索引为 idx_user_id_content_id
3、查询部分人不可见:耗时13毫秒左右;使用到的索引为 idx_content_id
综上所述 采用 mysql最快的响应时间为并行执行每次查询,耗时在50毫秒以内
总结
1.mysql建立合适的索引,避免回表的情况下,其查询性能还是非常优异的。
2.对于 ES 的测试结果,其实并不令人意外。不过,对于 ES 在字典中查找对应 keyword 的具体方式,我充满了好奇。目前我在思考它是否基于二分法进行查找呢?
毕竟在面对庞大的数据量时,如果采用二分法,可能会在一定程度上影响查询速度。遗憾的是,目前我还没有找到关于 ES 底层查询原理的详细资料,所以这仅仅是我的一种猜测罢了。倘若让我来编写这样一个程序,在没有更多信息的情况下,二分法或许是我首先能想到的一种实现方式。
但我深知,ES 作为一款成熟的搜索引擎,其查询原理必定更加复杂和高效,肯定不仅仅局限于简单的二分法。我期待着深入了解 ES 的底层查询机制,以便更好地理解和应用它在实际项目中的强大功能。这个问题有时间再做深入研究。
通过这次对比测试,我们可以看出在特定的查询场景下,MySQL 在性能上有着明显的优势。然而,ES 也有其独特的应用场景,如全文搜索等。在实际应用中,我们需要根据具体的需求来选择合适的数据库技术,以达到最佳的性能和效果。
blog.csdn.net/ezreal_pan/article/details/144292783
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
点“在看”支持我们,共同成长