ES和MySQL面对大数据查询,谁才是性能之王?

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

ccc01e217cf693a67eff2b2ba371d7c8.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、ERP、CRMAI 大模型等等功能:

  • Boot 多模块架构:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 微服务架构:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 双版本 

来源:blog.youkuaiyun.com/ezreal_pan
/article/details/144292783

3e46e0814eba67d94b2efd038b1f7a37.jpeg


在进行数据查询性能测试的过程中,我的同事幺加明对 ES(Elasticsearch)和 MySQL 进行了相对较大数据量的测试,并整理了相关结果。在得到其授权的情况下,我将此对比案例分享给大家,在此再次向幺加明表示感谢。

一、结论

通过对es和mysql相对较大数据量的测试,得出结果:在Mysql查询使用到合适的索引的条件下,通过mysql得到相应结果的速度要明显优于Es。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、通过es实现

Es 文档数据模型:
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
}
测试数据量及条件

测试 ES 数据量为 2000 万的作品数,5000 的用户量(此用户量与实际情况有出入,理论上应有至少 20 万的用户量)。

当设置给部分人可见时,AllowUser 内有 30 个元素;同样,当设置不给谁看时,BlockUser 内也是有 30 个元素。所以对应的总数据量在 3 亿条左右。

查询条件如下:

1、单独查询公开可见数据:查询时间在275毫秒左右

4ad979aef8de826cbb02febb636befa7.png

2、单独查询部分可见数据:耗时70毫秒左右

b58467e18d5616123303244a7889cfd2.png

3、单独查询部分不可见数据:耗时255毫秒左右

307f7a4c5df1ced4ff395a58b80198f3.png

4、合并三次查询未一次查询就得到结果的话:耗时428毫秒左右

f438751fa7d774386b1ea34a3b5ab6a7.png

综上所述 采用 Es最快的响应时间为并行执行每次查询,耗时在300毫秒以内。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、通过mysql实现

Mysql 表结构如下:
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='内容权限表(可见设置)'
测试条件及数据量

测试 MySQL 数据量为 1000 万的作品数据,总共 1.5 亿权限相关数据。

查询条件如下:

1、查询公开数据:耗时21毫秒左右;使用到的索引为 idx_content_id

f18b82120a89e188b7de8fdf39b92b48.png

2、查询部分人可见:耗时48毫秒左右;使用到的索引为 idx_user_id_content_id

8414112a3345f8d15ee778ad5120658f.png

3、查询部分人不可见:耗时13毫秒左右;使用到的索引为 idx_content_id

33ef6c2fc70c46e2579bf4f013113328.png

综上所述 采用 mysql最快的响应时间为并行执行每次查询,耗时在50毫秒以内

总结

1.mysql建立合适的索引,避免回表的情况下,其查询性能还是非常优异的。

2.对于 ES 的测试结果,其实并不令人意外。不过,对于 ES 在字典中查找对应 keyword 的具体方式,我充满了好奇。目前我在思考它是否基于二分法进行查找呢?

毕竟在面对庞大的数据量时,如果采用二分法,可能会在一定程度上影响查询速度。遗憾的是,目前我还没有找到关于 ES 底层查询原理的详细资料,所以这仅仅是我的一种猜测罢了。倘若让我来编写这样一个程序,在没有更多信息的情况下,二分法或许是我首先能想到的一种实现方式。

但我深知,ES 作为一款成熟的搜索引擎,其查询原理必定更加复杂和高效,肯定不仅仅局限于简单的二分法。我期待着深入了解 ES 的底层查询机制,以便更好地理解和应用它在实际项目中的强大功能。这个问题有时间再做深入研究。

通过这次对比测试,我们可以看出在特定的查询场景下,MySQL 在性能上有着明显的优势。然而,ES 也有其独特的应用场景,如全文搜索等。在实际应用中,我们需要根据具体的需求来选择合适的数据库技术,以达到最佳的性能和效果。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

a56cb5d033ab58f7b505547aa8cc1583.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

53c73d3a0e32c00d202a0a3dd9b809ff.png

c9807d4c01058f21abb3c9e130ea6b4b.pngef2759d24d674c03bebc26ea9f83e9fe.png661cbd7fe57192214e963392c68226fd.png2b0efbac22addaf74b59359d6482238b.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值