我是靠谱客的博主 唠叨蜗牛,这篇文章主要介绍用STRAIGHT_JOIN优化mysql的执行速度,现在分享给大家,希望可以做个参考。

优化sql的执行速度,我们通常需要查看EXPLAIN的结果,没有使用索引的加上索引,索引使用不对的也可以强制使用某个索引,但是有些情况下,这2招都不管用,是sql内部的执行顺序不正确,导致速度很慢。

执行顺序通常是mysql内部优化器根据表预测的大小,索引等等情况自动判断的,但是某些情况下会判断错误,这个时候我们就需要调整执行顺序。

mysql8.0以上有优化器提示(Optimizer Hints),可以详细控制优化器的执行顺序,比较复杂。但是生产环境是5.6,无法使用。

8.0以下可以使用STRAIGHT_JOIN 来调整执行顺序,用法也比较简单,用STRAIGHT_JOIN 来代替JOIN就可以了,mysql会按照书写的顺序从左到右执行,这样我们就控制了mysql执行顺序。

下面我们来看一个具体的例子,有4个表INNER JOIN连接,还有一个EXISTS条件

复制代码
1
2
3
4
5
6
7
8
9
10
SELECT * FROM mm_detail a INNER JOIN mm_domain d ON d.DOMAIN=a.DOMAIN INNER JOIN mm_media c ON c.DOMAIN_ID=d.DOMAIN_ID INNER JOIN mm_url x ON x.MEDIA_ID=c.MEDIA_ID WHERE a.URL_TYPE=1 AND NOT EXISTS(SELECT 1 FROM mm_detail y WHERE y.URL_TYPE=3 AND y.URL_UNIQUE=x.URL_UNIQUE AND y.GROUP_NO=a.GROUP_NO)

由于数据量比较大,上面这个sql要执行几个小时以上,具体是几个小时不知道,没有耐心等待

 

idselect_typetabletypepoosible_keyskeykey_kenrefrowsExtra
1PRIMARYxALLmedia_id   238426Using where
1PRIMARYceq_refPRIMARY,DOMAIN_IDPRIMARY8media.x.MEDIA_ID1 
1PRIMARYdeq_refPRIMARY,domainPRIMARY4media.c.DOMAIN_ID1 
1PRIMARYarefIDX_SEARCH,IDX_DOMAIN,IDX_URL_TYPEIDX_DOMAIN768media.d.DOMAIN26Using index condition; Using where
2DEPENDENT SUBQUERYyrefIDX_SEARCH,IDX_GROUP_NO,IDX_URL_TYPE,IDX_URL_UNIQUEIDX_SEARCH2111const,media.a.GROUP_NO,media.x.URL_UNIQUE1Using index

从EXPLAIN的结果可以看到执行顺序,先执行了包含EXISTS的x表,并且是遍历全表,由于x表数据量最大,导致非常慢,这个执行顺序显然是错误的

下面我用STRAIGHT_JOIN  代替 INNER JOIN,强制查询顺序,执行时间变成21秒,差距非常大

 

复制代码
1
2
3
4
5
6
7
8
9
10
SELECT * FROM mm_detail a STRAIGHT_JOIN mm_domain d ON d.DOMAIN=a.DOMAIN STRAIGHT_JOIN mm_media c ON c.DOMAIN_ID=d.DOMAIN_ID STRAIGHT_JOIN mm_url x ON x.MEDIA_ID=c.MEDIA_ID WHERE a.URL_TYPE=1 AND NOT EXISTS(SELECT 1 FROM mm_detail y WHERE y.URL_TYPE=3 AND y.URL_UNIQUE=x.URL_UNIQUE AND y.GROUP_NO=a.GROUP_NO)

 

idselect_typetabletypepoosible_keyskeykey_kenrefrowsExtra
1PRIMARYarefIDX_SEARCH,IDX_DOMAIN,IDX_URL_TYPEIDX_SEARCH4const223000Using where
1PRIMARYdeq_refPRIMARY,domaindomain302media.a.DOMAIN1Using index condition
1PRIMARYcrefPRIMARY,DOMAIN_IDDOMAIN_ID4media.d.DOMAIN_ID2 
1PRIMARYxrefmedia_idmedia_id9media.c.MEDIA_ID264Using where
2DEPENDENT SUBQUERYyrefIDX_SEARCH,IDX_GROUP_NO,IDX_URL_TYPE,IDX_URL_UNIQUEIDX_SEARCH2111const,media.a.GROUP_NO,media.x.URL_UNIQUE1Using index

从EXPLAIN的结果我们看到,执行顺序按照sql的书写顺序,都使用了索引,这个就是速度变快的原因。

最后

以上就是唠叨蜗牛最近收集整理的关于用STRAIGHT_JOIN优化mysql的执行速度的全部内容,更多相关用STRAIGHT_JOIN优化mysql内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部