惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - Franky
V
V2EX
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 叶小钗
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
D
Docker
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志

希仁之拥

领克900半年使用体验 | 希仁之拥的博客 Ubuntu 26.04 Desktop使用体验 | 希仁之拥的博客 【转载】谈谈不受欢迎的博客技术特征 | 希仁之拥的博客 【转载】ClaudeCode 你想知道的所有秘密,源码深度研究报告 | 希仁之拥的博客 2025年年终总结 | 希仁之拥的博客 集成和使用Openclaw后的思考 | 希仁之拥的博客 我买了领克900 | 希仁之拥的博客 服务器性能优化之io拷贝 | 希仁之拥的博客 Go-Sail导航站上线啦 | 希仁之拥的博客 今年国庆的一些感受 [2025] | 希仁之拥的博客 在Deepin 25上配置forticlient | 希仁之拥的博客 分享一些酷酷的站点 [20250908] | 希仁之拥的博客 Go-Sail发布v3.0.6版本了 | 希仁之拥的博客 我对V2EX发布$V2EX讨论的一些感受 | 希仁之拥的博客 如何让Stripe支持支付宝和微信支付 | 希仁之拥的博客 2025上半年里程碑 | 希仁之拥的博客 GitLab+Drone使用体验 | 希仁之拥的博客 四姑娘山之旅 | 希仁之拥的博客 近来帮同事做性能优化的过程回顾 | 希仁之拥的博客 聊聊接口的返回数据结构 | 希仁之拥的博客 由GORM的Updates语法糖 我把 Go-Sail 的文档站更新了 | 希仁之拥的博客 这就是我为什么讨厌拼多多 | 希仁之拥的博客 元旦快乐~ | 希仁之拥的博客 致敬还在写博客的我们 | 希仁之拥的博客 逐步的把图片资源迁移到星光图床上 | 希仁之拥的博客 帮弟弟配了一台mini主机 | 希仁之拥的博客 国庆的一些碎碎念 | 希仁之拥的博客 就这一刻而言,我觉得科技冷冰冰的。 | 希仁之拥的博客 如何使用acme.sh自动续签证书 | 希仁之拥的博客
[mysql优化]子查询与连接查询 | 希仁之拥的博客
希仁之拥 · 2018-06-26 · via 希仁之拥
  • 1.玩家新建表部分字段
    data_account_creates | CREATE TABLE `data_account_creates` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `world_id` int(11) NOT NULL,
    `channel_id` int(11) NOT NULL,
    `account` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    PRIMARY KEY (`id`),
    KEY `data_account_creates_world_id_log_time_index` (`world_id`,`log_time`),
    KEY `create_time_world_channel` (`log_time`,`world_id`,`channel_id`),
    ) ENGINE=InnoDB AUTO_INCREMENT=41423 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
  • 2.玩家登录表部分字段
    data_account_logins | CREATE TABLE `data_account_logins` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `world_id` int(11) NOT NULL,
    `channel_id` int(11) NOT NULL,
    `account` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    PRIMARY KEY (`id`),
    KEY `account` (`account`,`log_time`),
    KEY `data_account_logins_world_id_log_time_index` (`world_id`,`log_time`),
    KEY `login_time_world_channel` (`log_time`,`world_id`,`channel_id`),
    ) ENGINE=InnoDB AUTO_INCREMENT=148269 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    查询结果需求:[有效新增]>所选时期内,每日新增用户中在注册起7日内(包含当日)有2日及以上登陆过游戏的用户数量。

    a.使用子查询,explain分析

使用子查询,explain分析1 使用子查询,explain分析2

查询结果如下:

使用子查询,explain查询结果

b.使用连接查询,explain分析

使用连接查询,explain分析 使用连接查询,explain分析

查询结果如下:

使用连接查询,explain分析查询结果

我们首先从子查询看起:

i.子查询使用了三次临时表[using temporary],两次外部排序[using filesort]。最多扫描行数:57494。 ii.连接查询使用了两次临时表,两次外部排序。最多扫描行数7845。 使用show processlist可以看到使用子查询时,最长的时间消耗是在创建临时表数据[copying to tmp table]这个阶段:

show processlist

总结:在使用查询语句时,应当注意临时表的情况,尽可能减少临时表的数量以及扫描行数,提高命中率。

转载请注明原文地址:https://blog.keepchen.com/a/mysql-query-optimization.html