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来解决的,有事在应用层面,业务层面来思考也是很必要的