MySQL里几个查询语句的性能优化论证

前几天在网上看了一个帖子,描述的现象是在MySQL中,对in,or,union all的性能的比对,看完之后,我就产生了疑问。

文章的大意是说,使用in,or的查询效率较低,大概查询需要花费11秒,而使用了union all的方式之后,性能提高到了0.02秒。

如果单纯说是MySQL半连接的优化器性能问题,我信,但是看了文中提供的SQL语句,我感觉至少从我使用MySQL 5.7的感觉来看,这个差别会很小,或者说没有差别。

当然有这个想法,自己也得论证不是。我就尝试了两次,文中说数据量大概是20万记录,那我就扩大一下,做一下100万数据的测试,看看效果。

创建表article,

create table article(id int primary key ,article_category int);

使用如下的方式初始化数据。

delimiter $$ drop procedure if exists proc_auto_insertdata$$ create procedure proc_auto_insertdata() begin declare init_data integer default 1; while init_data<=1000000 do insert into article values(init_data,1); insert into article values(init_data+1,2); insert into article values(init_data+2,3); insert into article values(init_data+3,4); insert into article values(init_data+4,5); set init_data=init_data+5; end while; end$$ delimiter ;

插入数据,这个部分,我启用了显式事务,效果很明显。在本机测试100万的数据量大概是21秒钟即可完成。

继续运行上面的语句,性能还不错,基本都在1秒钟(当然数据是在缓存里面),三种方式的性能有差异,但是远没有稳中说得那么大了。

是不是数据量还不够呢,我们继续做一个测试,把初始化数据库修改为1000万,再来看看效果。

我们继续做一个优化改进,创建一个索引出来。数据量扩大10倍,为1000万。

alter table article add key (article_category,id);

再来看看效果发现上面的3个语句的执行效率相仿。

通过上的测试,充分说明了在MySQL 5.7的测试中,这个问题严格来说不是问题,可能是版本有关,还有一个是使用了更多的数据,性能却明显好许多。这个可能和表结构有一些出入。

总之,我们得到一个初步的结论,很可能自己测试的时候却没有,需要理性看待。以免得到错误的结论。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

android开发性能分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项...

2535
来自专栏牛客网

美团Java面经

没有一点儿疯狂,生活就不值得过。听凭内心的呼声的引导吧,为什么要把我们的每一个行动像一块饼似的在理智的煎锅上翻来覆去地煎呢?——米兰·昆德拉《不朽》

2023
来自专栏恰同学骚年

操作系统核心原理-3.进程原理(下):进程通信

进程作为人类的发明,自然也免不了脱离人类的习性,也有通信的需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。人类的通信方式无外乎对白(通过...

1032
来自专栏塔奇克马敲代码

Windows平台下源码分析工具

1903
来自专栏java一日一条

阿里,网易 云音乐以及商汤科技的大数据面试经

项目方面:项目闪光点、优化点、涉及到的关键技术这些基本都会问,事先最好准备一下、如果有开源项目经验就更好。

2916
来自专栏塔奇克马敲代码

Windows平台下源码分析工具

2313
来自专栏吉浦迅科技

DAY64:阅读 Memory Model

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第64天,我们正在讲解CUDA C语法,希望在接下来的36天里,您可以学...

723
来自专栏铭毅天下

Elasticsearch检索分类深入详解—基础篇

Elasticsearch中当我们设置Mapping(分词器、字段类型)完毕后,就可以按照设定的方式导入数据。 有了数据后,我们就需要对数据进行检索操作。根据...

3807
来自专栏牛客网

蚂蚁金服面经(3+4)

【每日一语】我和这个世界不熟。这并非是我撕裂的原因。我依旧有很多完整,至少我要成全我自己。──北岛《我和这个世界不熟》

2162
来自专栏hbbliyong

JAVA试练塔之试炼技能图

1.计算机基础: 1.1数据机构基础: 主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二...

3827

扫码关注云+社区

领取腾讯云代金券