MySQL exists还是慎用

本文探讨了在使用MariaDB和MySQL时如何优化SQL查询性能,特别是针对存在大量数据的情况,对比了使用EXISTS子句与JOIN操作的不同执行计划,强调了合理选择查询方式的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  不管是MariaDB还是Oracle的MySQL,如果外面的表很大,要慎用exists。

select version();

+-----------------+
| version()  |
+-----------------+
| 10.1.22-MariaDB |
+-----------------+

EXPLAIN  SELECT CAC.*
 FROM TOP_CFG_ATTRIBUTE_CONFIG CAC
WHERE EXISTS (SELECT 1
         FROM TOP_CFG_CONFIG CC, TOP_CFG_ATTRIBUTE CA
        WHERE CC.CONFIG_ID = CA.CONFIG_ID
          AND CA.ATTRIBUTE_ID = CAC.ATTRIBUTE_ID
          AND CC.CONFIG_FULLCODE = 'DISTRIBUTED_LOCK_OPEN_CONFIG'
          AND CC.IS_VALID = 1);
 id  select_type         TABLE   TYPE    KEY                      key_len  ref                      ROWS  Extra        
---  ------------------  ------  ------  -----------------------  -------  ---------------------  ------  ------------
  1  PRIMARY             CAC     ALL     (NULL)                   (NULL)   (NULL)                    393 USING WHERE  
  2  DEPENDENT SUBQUERY  CC      ref     ind_tcc_CONFIG_FULLCODE  768      const                      1  USING WHERE  
  2  DEPENDENT SUBQUERY  CA      eq_ref  PRIMARY                  110      CAC.attribute_id           1  USING WHERE             
          
EXPLAIN SELECT CAC.*
 FROM TOP_CFG_ATTRIBUTE_CONFIG CAC,TOP_CFG_CONFIG CC, TOP_CFG_ATTRIBUTE CA
WHERE  CC.CONFIG_ID = CA.CONFIG_ID
          AND CA.ATTRIBUTE_ID = CAC.ATTRIBUTE_ID
          AND CC.CONFIG_FULLCODE = 'DISTRIBUTED_LOCK_OPEN_CONFIG'
          AND CC.IS_VALID = 1;
 id  select_type  TABLE   TYPE   KEY                      key_len  ref                 ROWS  Extra        
---  -----------  ------  ------ -----------------------  -------  -----------------  ----  -------------
  1  SIMPLE       CC      ref    ind_tcc_CONFIG_FULLCODE  768      const                 1  USING WHERE  
  1  SIMPLE       CA      ref    ind_tca_CONFIG_ID        111        CC.config_id        1  USING INDEX  
  1  SIMPLE       CAC     ref    ind_tcac_ATTRIBUTE_ID    111       CA.attribute_id      1  (NULL)       
                                                                                                                                                   

select version();
+------------+
| version()  |
+------------+
| 5.6.37-log |
+------------+
EXPLAIN  SELECT CAC.*
 FROM TOP_CFG_ATTRIBUTE_CONFIG CAC
WHERE EXISTS (SELECT 1
         FROM TOP_CFG_CONFIG CC, TOP_CFG_ATTRIBUTE CA
        WHERE CC.CONFIG_ID = CA.CONFIG_ID
          AND CA.ATTRIBUTE_ID = CAC.ATTRIBUTE_ID
          AND CC.CONFIG_FULLCODE = 'DISTRIBUTED_LOCK_OPEN_CONFIG'
          AND CC.IS_VALID = 1);
+----+--------------------+-------+--------+-------------------------+---------+-----------------------+------+-------------+
| id | select_type        | table | type   | key                     | key_len | ref                   | rows | Extra       |
+----+--------------------+-------+--------+-------------------------+---------+-----------------------+------+-------------+
|  1 | PRIMARY            | CAC   | ALL    | NULL                    | NULL    | NULL                  |  490 | Using where |
|  2 | DEPENDENT SUBQUERY | CC    | ref    | ind_tcc_CONFIG_FULLCODE | 768     | const                 |    1 | Using where |
|  2 | DEPENDENT SUBQUERY | CA    | eq_ref | PRIMARY                 | 326     | CAC.attribute_id      |    1 | Using where |
+----+--------------------+-------+--------+-------------------------+---------+-----------------------+------+-------------+

EXPLAIN SELECT CAC.*
 FROM TOP_CFG_ATTRIBUTE_CONFIG CAC,TOP_CFG_CONFIG CC, TOP_CFG_ATTRIBUTE CA
WHERE  CC.CONFIG_ID = CA.CONFIG_ID
          AND CA.ATTRIBUTE_ID = CAC.ATTRIBUTE_ID
          AND CC.CONFIG_FULLCODE = 'DISTRIBUTED_LOCK_OPEN_CONFIG'
          AND CC.IS_VALID = 1;
+----+-------------+-------+------+------------------------+---------+----------------------+------+-------------+
| id | select_type | table | type |key                     | key_len | ref                  | rows | Extra       |
+----+-------------+-------+------+------------------------+---------+----------------------+------+-------------+
|  1 | SIMPLE      | CC    | ref  |ind_tcc_CONFIG_FULLCODE | 768     | const                |    1 | Using where |
|  1 | SIMPLE      | CA    | ref  |ind_tca_CONFIG_ID       | 327     | CC.config_id         |    1 | Using index |
|  1 | SIMPLE      | CAC   | ref  |ind_tcac_ATTRIBUTE_ID   | 327     | CA.attribute_id      |    1 | NULL        |
+----+-------------+-------+------+------------------------+---------+----------------------+------+-------------+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值