⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/ezreal_pan/article/details/144292783 「ezreal_pan」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

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

一、结论

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

二、通过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毫秒左右

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

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

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

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

三、通过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

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

文章目录
  1. 1. 一、结论
  2. 2. 二、通过es实现
    1. 2.0.1. Es 文档数据模型:
    2. 2.0.2. 测试数据量及条件
    3. 2.0.3. 查询条件如下:
  • 3. 三、通过mysql实现
    1. 3.0.1. Mysql 表结构如下:
    2. 3.0.2. 测试条件及数据量
    3. 3.0.3. 查询条件如下:
  • 4. 总结