mysql子查询优化思路,MySQL优化心得

一打开科技类论坛,最常看到的文章主题就是MySQL性能优化了,为什么要优化呢?

因为:

* 数据库出现瓶颈,系统的吞吐量出现访问速度慢

* 随着应用程序的运行,数据库的中的数据会越来越多,处理时间变长

* 数据读写速度缓慢

就是咱们说的“性能问题”,程序员一遇到它总是焦头烂额!

今天小编对MySQL优化总结了一些心得,希望在大家之后的工作中能有所有帮助!

# like 前导符优化 #

like模糊查询形如'%AAA%'和'%AAA'将不会使用索引,但是业务上不可避免可能又需要使用到这种形式。

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL]

通常的方法有两种:

优化方案一:

使用覆盖索引,即查询出的列只是用索引就可以获取,而无须查询表记录,这样也走了索引;

优化方案二:

使用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(大表)

示例一:

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL 1]

示例二:

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL 2]

# not in 和 not exist #

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exist 的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in要快!

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL 3]

# 子查询优化 #

1、MySQL 5.6 之前的版本对子查询处理:不会将查询的结果集计算出来用作与其他表做join,outer表每扫描一条数据,子查询都会被重新执行一遍。

2、MySQL 5.6 对子查询的处理 :将子查询的结果集 cache 到临时表里,临时表索引主要用来移除重复记录,并且随后也可能用于做join查询,这种技术在 5.6 中叫做物化的子查询,物化子查询可以看到select\_type字段为subquery,而在 5.5 里为DEPENDENT SUBQUERY。

3、子查询一般都可以改成表的关联查询,子查询会有临时表的创建、销毁,效率低下。

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL 4]

# straight\_join #

mysql hint:

Mysql 优化器在处理多表的关联的时候,很有可能会选择错误的驱动表进行关联,导致了关联次数的增加,从而使得sql语句执行变得非常的缓慢。

这个时候需要有经验的DBA进行判断,选择正确的驱动表,这个时候 straightjoin 就起了作用了,下面我们来看一看使用straight\_join进行优化的案例:

尝试采用user表做驱动表,使用straight\_join强制连接顺序:

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL 5]

# 高效分页 #

传统分页

select * from table limit 10000,10

limit原理

(1) Limit 10000,10

(2)偏移量越大则越慢

推荐分页

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL 6]

# 复杂关联SQL的优化 #

1、首先查询返回的结果集,通常查询返回的结果集很少,是有优化的空间的。

2、通过查看执行计划,查看优化器选择的驱动表,从执行计划的rows可以大致反应出问题的所在。

3、搞清各表的关联关系,查看关联字段是否有合适的索引。

4、使用straight\_join关键词来强制调整驱动表的选择,对优化的想法进行验证。

5、如果条件允许,对复杂的SQL进行拆分。尽可能越简单越好。

# force index #

有时优化器可能由于统计信息不准确等原因,没有选择最优的执行计划,可以人为改变mysql的执行计划,例如:

![DBA大牛MySQL优化心得,语句执行加速就是这么简单!][DBA_MySQL 7]

# count的优化 #

按照效率排序的话,count(字段)

# 总结 #

MySQL 性能优化 最主要是理解 innodb 的索引原理及结构及 SQL 的执行计划,在不断累积经验的基础上熟能生巧。

[DBA_MySQL]: /images/20210318/1616079579948.jpg

[DBA_MySQL 1]: /images/20210318/1616079569028.jpg

[DBA_MySQL 2]: /images/20210318/1616079557941.jpg

[DBA_MySQL 3]: /images/20210318/1616079543471.jpg

[DBA_MySQL 4]: /images/20210318/1616079530583.jpg

[DBA_MySQL 5]: /images/20210318/1616079515759.jpg

[DBA_MySQL 6]: /images/20210318/1616079458250.jpg

[DBA_MySQL 7]: /images/20210318/1616079433586.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值