MySQL exists还是慎用

  不管是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        |
+----+-------------+-------+------+------------------------+---------+----------------------+------+-------------+

猜你喜欢

转载自blog.csdn.net/guogang83/article/details/79163183