专栏名称: Java知音
专注于Java,推送技术文章,热门开源项目等。致力打造一个有实用,有情怀的Java技术公众号!
目录
相关文章推荐
Java基基  ·  拿自己的旧电脑搭建了个服务器! ·  3 天前  
Java基基  ·  拿自己的旧电脑搭建了个服务器! ·  3 天前  
AIGC开放社区  ·  Meta重磅开源Llama ... ·  5 天前  
数据分析与开发  ·  直接问懵圈,MySQL一次批量插入多少条数据 ... ·  6 天前  
学习强国  ·  规范营销行为 防范外卖餐饮浪费新规出台 ·  5 天前  
学习强国  ·  规范营销行为 防范外卖餐饮浪费新规出台 ·  5 天前  
51好读  ›  专栏  ›  Java知音

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

Java知音  · 公众号  · 数据库 互联网安全  · 2024-12-08 10:40

正文

在进行数据查询性能测试的过程中,我的同事幺加明对 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 也有其独特的应用场景,如全文搜索等。在实际应用中,我们需要根据具体的需求来选择合适的数据库技术,以达到最佳的性能和效果。

作者:ezreal_pan   来源:
blog.csdn.net/ezreal_pan/article/details/144292783

1. Java面试题精选阶段汇总,已更新450期~

2. 推荐一款精美、高质量、开源的问卷系统

3. 一款高颜值、开源的物联网一体化平台

4. 18 个一线工作中常用 Shell 脚本【实用版】

PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。

“在看”支持我们,共同成长