专栏名称: Java知音
专注于Java,推送技术文章,热门开源项目等。致力打造一个有实用,有情怀的Java技术公众号!
目录
相关文章推荐
现代快报  ·  蔚来“悬赏”,最高100万元! ·  昨天  
现代快报  ·  蔚来“悬赏”,最高100万元! ·  昨天  
昌吉日报  ·  最新!手机号可以线上销户 ·  3 天前  
昌吉日报  ·  最新!手机号可以线上销户 ·  3 天前  
51好读  ›  专栏  ›  Java知音

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

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

主要观点总结

文章主要介绍了同事幺加明对Elasticsearch(ES)和MySQL进行大数据量测试的情况。测试包括数据模型定义、测试数据量及条件、查询条件等。通过对比测试,文章发现在合适的索引条件下,MySQL的查询速度明显优于ES。文章还探讨了ES的底层查询原理,并强调了根据具体需求选择合适的数据库技术的重要性。

关键观点总结

关键观点1: 测试背景与目的

同事幺加明对ES和MySQL进行大数据量测试,并分享测试结果。

关键观点2: ES数据模型与测试数据量

介绍ES的数据模型,测试数据量达到2000万的作品数和5000的用户量,实际用户量应至少20万。在特定查询场景下,测试了不同权限类型的查询性能。

关键观点3: MySQL表结构与测试数据量

介绍MySQL的表结构,测试数据量为1000万的作品数据,总共1.5亿权限相关数据。测试了不同权限类型的查询性能,并强调合适索引的重要性。

关键观点4: 测试结果与分析

在特定查询场景下,MySQL的查询性能明显优于ES。文章还探讨了ES的底层查询原理,并强调了根据具体需求选择合适的数据库技术的重要性。


正文

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

一、结论

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

二、通过es实现

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

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

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

unset unset 查询条件如下: unset unset

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

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

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

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

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

三、通过mysql实现

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

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

unset unset 查询条件如下: unset unset

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

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

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

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







请到「今天看啥」查看全文