mysql性能优化(二)

Profiling(DBA)

使用profiling可以查看sql的占用CPU ,I/O的使用情况,具体的使用方法为:
1.set pfofiling=1;
2.select XXXXXXXXX (需要分析的sql)
3.show profiles;
之后就会出现对应的查询序列的ID,有对应的cpu占用的时间
在这里插入图片描述
4.show profile cpu,block,io for query xx;
在这里插入图片描述
会有状态信息,io.cpu等等信息

了解Join的底层逻辑实现原理

简要文字说明:首先我们会先查询驱动表,然后根据驱动表的查询结果区轮询被驱动表,具体的实现逻辑如下

在这里插入图片描述

如何优化Join

在这里插入图片描述
1.尽量使用小结果集,驱动大结果集
原因:Join的底层逻辑决定了,驱动表的结果会遍历轮询被驱动表,如果驱动表的数据集很大,那么遍历次数就会很多了
2.保证被驱动表的Join字段是被索引到的
原因:他是有驱动表根据join段的值区查询表的,如果是join的索引到的字段,他就走索引,提高查询效率
3.加大Join Buffer
原因:多表Join的时候,会用到Join Buffer,如果不够大,它会进行分段,会消耗I/O

order by的底层原理

如果排序字段是索引字段,那么我们都是走索引的:
原因:我们Innodb底层的索引实现方式B+Trees,B+Trees中,数据都摆放在叶子节点里面,而且是一个接一个有序的
在这里插入图片描述
在这里插入图片描述
非索引字段,我们就不走索引了
在这里插入图片描述
order by非索引的底层实现原理有两种实现方式,如下图:
在这里插入图片描述
第二种方式,用空间换时间:
在这里插入图片描述

如何优化order by

1.在这里插入图片描述
1.排序字段尽量所用我们的索引字段
原因:我们Innodb底层的索引使用的B+Trees,它的数据存放在叶子节点,且有序的
2.加大max_length_for_sort_data,
原因:从而使用第二种方式,空间来换时间
3.去掉不必要的字段
原因:排序会把需要的字段加载到内存,消耗IO
4.增大sort_buffer_size
原因:减少分段

Group by是根据order by做的

DISTINCT是根据Group by做的

总结思考如何思考mysql性能优化:

1.具体的思考流程
在这里插入图片描述
2.如何开启慢查询日志:
在这里插入图片描述
最后说一句:不是所有的MySQL性能问题都可以通过优化MySQL来解决的,有事在应用层面,业务层面来思考也是很必要的

猜你喜欢

转载自blog.csdn.net/sinat_30594513/article/details/88784472