您的位置:首页 > 数据库 > MySQL

DBA大牛告诉你,如何让MySQL语句执行加速?

2019-07-25 08:43 1461 查看

作者:老王谈运维  来源:http://t.cn/Ai96rftr


一打开科技类论坛,最常看到的文章主题就是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(主键id)<count(1)≈count(*),所以我建议你,尽量使用count(*)。


# 总结


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



福利第23天



OK,接下来到了福利的时间了,首先公布一下昨日被选中的朋友:浮游、微风正好、冷漠勿沉默、﹏HJW、Joy、予衬、微彦予、哎呀学习好有趣、鬮䶩、Q.IAN、Master、a'ゞ七凉、C、大调 🌸、Avril゛、郑子萌、风风风、....、宝宝、andg、Harwin、swallow、一年、打V、Tsui kaho、慢慢、浮云、chenjunjiang、quietblue、编程难、思想其实很高尚、啾啾、cherishPresent、Coson Yu、LX、丶藏匿、过来人、Tianjiao、Snail、胡达尔汗、等待戈多、金彦(流星雨)、Zoey、稻草人喜洋洋乐陶陶、李昆仑、haolihaoli、梁凉、认真、安妮可以、HJH、先知先觉、honng、大石碎胸口、陌生、惜与序、Devil、Mahombo、橘喵、赵伟、世界温柔以待、จุ๊บEmperor Wen、拾月、就开心、我的梨子啊💐、gan佳佳、胡浪同學。这些朋友请加我微信领取红包。(备注:红包。我中午或者晚上统一发射)。我真的选了50个!



老规矩:在留言区选50位,50元红包。我尽量多照顾到一些朋友,虽然红包金额少点了,但是比抢个几毛钱还是多的,大家可以一起乐呵。


留言之后我会把你的留言放出来,大家不要全部过来问我是不是被选中了哈,我在第明天会公布结果的,只要不超过50位都会选中,超了我就再筛选下。只要你在明天公布的名单内就来找我要红包即可,就这么简单!


每天过来坐坐,看看文章,领领红包,交交朋友!今日话题是:你们平时都如何优化SQL欢迎讨论!(明天公布选择结果)。


关注我

程序员私房菜

看文章 * 领福利



点赞是最大的支持 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: