社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

Java知音 • 3 月前 • 156 次点击  

在进行数据查询性能测试的过程中,我的同事幺加明对 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查询条件如下:unset unset

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

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

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

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

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

三、通过mysql实现

unsetunsetMysql 表结构如下: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='内容权限表(可见设置)'
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:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/176674
 
156 次点击