加入收藏 | 设为首页 | 会员中心 | 我要投稿 吕梁站长网 (https://www.0358zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL5.7中select半连接优化的示例解析

发布时间:2022-01-10 16:09:58 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要为大家展示了MySQL5.7中select半连接优化的示例分析,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下MySQL5.7中select半连接优化的示例分析这篇文章吧。 MySQL的子查询一直以来都是性能差的著称,解
        这篇文章主要为大家展示了“MySQL5.7中select半连接优化的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL5.7中select半连接优化的示例分析”这篇文章吧。
 
       MySQL的子查询一直以来都是性能差的著称,解决方法是以join代替。
       MySQL5.5版本中该查询先把accessLog表中版本为2.2的数据线过滤出来,然后每个符合条件的数据都与内表进行一次select id from accessLog_01,因此性能低下。MySQL5.5采取的解决方法是将in重写为exists。
      在MySQL5.6/5.7版本中,子查询执行计划是将in/exists重写为join,如下看执行计划:
 
点击(此处)折叠或打开
 
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.18-log |
+------------+
点击(此处)折叠或打开
 
mysql> explain select * from accessLog ac where ac.id in (select id from accessLog_01);
+----+--------------+--------------+------------+--------+---------------+---------+---------+----------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------+--------------+------------+--------+---------------+---------+---------+----------------+------+----------+-------+
| 1 | SIMPLE | <subquery2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | 100.00 | NULL |
| 1 | SIMPLE | ac | NULL | eq_ref | PRIMARY | PRIMARY | 8 | <subquery2>.id | 1 | 100.00 | NULL |
| 2 | MATERIALIZED | accessLog_01 | NULL | ALL | NULL | NULL | NULL | NULL | 1305 | 100.00 | NULL |
+----+--------------+--------------+------------+--------+---------------+---------+---------+----------------+------+----------+-------+
点击(此处)折叠或打开
 
mysql> explain select * from accessLog ac where exists (select * from accessLog_01);
+----+-------------+--------------+------------+------+---------------+------+---------+------+--------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------------+------------+------+---------------+------+---------+------+--------+----------+-------+
| 1 | PRIMARY | ac | NULL | ALL | NULL | NULL | NULL | NULL | 586090 | 100.00 | NULL |
| 2 | SUBQUERY | accessLog_01 | NULL | ALL | NULL | NULL | NULL | NULL | 1305 | 100.00 | NULL |
+----+-------------+--------------+------------+------+---------------+------+---------+------+--------+----------+-------+
点击(此处)折叠或打开
 
mysql> explain select ac.* from accessLog ac join accessLog_01 b on ac.id=b.id;
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------+------+----------+-------+
| 1 | SIMPLE | b | NULL | ALL | NULL | NULL | NULL | NULL | 1305 | 100.00 | NULL |
| 1 | SIMPLE | ac | NULL | eq_ref | PRIMARY | PRIMARY | 8 | xinhost.b.id | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------+------+----------+-------+
  办连接查询优化默认开启,通过show variables like 'optimizer_switch' G查询:
 
 
点击(此处)折叠或打开
 
mysql> show variables like 'optimizer_switch' G
*************************** 1. row ***************************
Variable_name: optimizer_switch
        Value: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on
1 row in set (0.01 sec)
  但是半连接优化只是针对查询,对于DML操作,性能依旧很差。
 
以上是“MySQL5.7中select半连接优化的示例分析”这篇文章的所有内容,感谢各位的阅读!

(编辑:吕梁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读