DBA大牛告诉你,如何让MySQL语句执行加速?
一打开科技类论坛,最常看到的文章主题就是MySQL性能优化了,为什么要优化呢?
因为:
数据库出现瓶颈,系统的吞吐量出现访问速度慢
随着应用程序的运行,数据库的中的数据会越来越多,处理时间变长
数据读写速度缓慢
就是咱们说的“性能问题”,程序员一遇到它总是焦头烂额!
今天我对MySQL优化总结了一些心得,希望在大家之后的工作中能有所有帮助!
like 前导符优化
like模糊查询形如'%AAA%'和'%AAA'将不会使用索引,但是业务上不可避免可能又需要使用到这种形式。
通常的方法有两种:
方案一:使用覆盖索引,即查询出的列只是用索引就可以获取,而无须查询表记录,这样也走了索引;
方案二:使用locate函数或者position函数代替like查询,如table.field like '%AAA%'可以改为locate('AAA', table.field) > 0或POSITION('AAA' IN table.field)>0
in 和 exist
如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)
示例一:
示例二:
not in 和 not exist
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exist 的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in要快!
子查询优化
1)MySQL 5.6 之前的版本对子查询处理:不会将查询的结果集计算出来用作与其他表做join,outer表每扫描一条数据,子查询都会被重新执行一遍。
2)MySQL 5.6 对子查询的处理 :将子查询的结果集 cache 到临时表里,临时表索引主要用来移除重复记录,并且随后也可能用于做join查询,这种技术在 5.6 中叫做物化的子查询,物化子查询可以看到select_type字段为subquery,而在 5.5 里为DEPENDENT SUBQUERY。
3)子查询一般都可以改成表的关联查询,子查询会有临时表的创建、销毁,效率低下。
straight_join
mysql hint:mysql 优化器在处理多表的关联的时候,很有可能会选择错误的驱动表进行关联,导致了关联次数的增加,从而使得sql语句执行变得非常的缓慢。
这个时候需要有经验的DBA进行判断,选择正确的驱动表,这个时候 straightjoin 就起了作用了,下面我们来看一看使用straight_join进行优化的案例。
尝试采用user表做驱动表,使用straight_join强制连接顺序:
高效分页
1)传统分页
select * from table limit 10000,10
2)limit原理
Limit 10000,10
偏移量越大则越慢
3)推荐分页
复杂关联SQL的优化
1、首先查询返回的结果集,通常查询返回的结果集很少,是有优化的空间的。
2、通过查看执行计划,查看优化器选择的驱动表,从执行计划的rows可以大致反应出问题的所在。
3、搞清各表的关联关系,查看关联字段是否有合适的索引。
4、使用straight_join关键词来强制调整驱动表的选择,对优化的想法进行验证。
5、如果条件允许,对复杂的SQL进行拆分。尽可能越简单越好。
force index
有时优化器可能由于统计信息不准确等原因,没有选择最优的执行计划,可以人为改变mysql的执行计划,例如:
count的优化
按照效率排序的话,count(字段)),所以我建议你,尽量使用count()。
总结
MySQL 性能优化 最主要是理解 innodb 的索引原理及结构及 SQL 的执行计划,在不断累积经验的基础上熟能生巧。
喜欢文章记得点个赞,感谢支持!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
天生强大的Redis是如何做实时订阅推送的
前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的。先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心 其中有一个功能叫做领劵的订阅推送。什么是领劵的订阅推送?就是用户订阅了该劵的推送,在可领取前的一分钟就要把提醒信息推送到用户的app中。本来这个订阅功能应该是消息中心那边做的,但他们说这个短时间内做不了。所以让我这个负责优惠劵的做了-.-!。具体方案就是到具体的推送时间点了,coupon系统调用消息中心的推送接口,把信息推送出去。下面我们分析一下这个功能的业务情景。公司目前注册用户6000W+,是哪家就不要打听了。。。比如有一张无门槛的优惠劵下单立减20元,那么抢这张劵的人就会比较多,我们保守估计10W+,百万级别不好说。我们初定为20W万人,那么这20W条推送信息要在一分钟推送完成!并且一个用户是可以订阅多张劵的。所以我们知道了这个订阅功能的有两个突出的难点:1、推送的实效性:推送慢了,用户会抱怨没有及时通知他们错过了开抢时机。2、推送的体量大:爆款的神劵,人人都想抢!然而推送体量又会影响到推送的实效性。这真是一个让人头疼的问题!那就让我们把问题一个...
- 下一篇
阿里云王广芳:5G时代,我们需要怎样的边缘计算?
7月24日阿里云峰会开发者大会的IT基础设施云化专场中,阿里云边缘计算高级技术专家王广芳进行了边缘节点服务重大升级发布,同时与现场观众一同探讨了5G时代边缘计算的思考与技术实践。 5G时代,我们需要怎样的边缘计算? 随着5G第一批牌照的发放完成,海量的终端设备连接到网络里来,数据经过网络的传输,做计算和处理,低延时、大流量、大连接的业务特点对网络和计算能力的挑战非常大,传统的云、端架构不足以支撑业务发展,这其中边缘计算就会发挥重要作用。 5G标准定义了超低延时、大流量和大连接,5G标准里面定义的延时是超低延时,空口的延时小于1毫秒,边缘计算把计算下沉到离设备和终端最近的一些边缘位置上,比如移动基站和汇聚的机房,将原来通信的节点变成计算的节点,解决了多级网络转发带来的延时消耗,实现真正的低延时。同时,为了应对大带宽和高并发,同样基于边缘基
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7设置SWAP分区,小内存服务器的救世主