mysql - 为什么不同的执行sql时间?

标签 mysql sql distinct explain

这里是 2 个 mysql 查询...这是一个简单的查询,但是选择了不同的字段 在第一次选择 mytable_city 在第二次 mytable_planing 中,两个字段都来自连接表。但查询执行时间有很大差异

SELECT SQL_NO_CACHE
DISTINCT `mytable_city`.`NAME` AS `FILTER_CITY`
FROM `b_iblock_element` `mytable` 
    LEFT JOIN `b_iblock_element_property` `mytable_planing_id` 
        ON `mytable`.`ID` = `mytable_planing_id`.`IBLOCK_ELEMENT_ID`
        AND `mytable_planing_id`.`IBLOCK_PROPERTY_ID` = 70
    INNER JOIN `b_iblock_element` `mytable_planing` 
        ON `mytable_planing_id`.`VALUE_HASH` = `mytable_planing`.`XML_HASH`
    LEFT JOIN `b_iblock_element_property` `mytable_housetype_id` 
        ON `mytable_planing`.`ID` = `mytable_housetype_id`.`IBLOCK_ELEMENT_ID`
        AND `mytable_housetype_id`.`IBLOCK_PROPERTY_ID` = 46
    INNER JOIN `b_iblock_element` `mytable_housetype` 
        ON `mytable_housetype_id`.`VALUE_HASH` = `mytable_housetype`.`XML_HASH`
    LEFT JOIN `b_iblock_element_prop_s4` `mytable_street_id` 
        ON `mytable_street_id`.`PROP_60_HASH` = `mytable_housetype`.`XML_HASH`
    INNER JOIN `b_iblock_element` `mytable_street` 
        ON `mytable_street_id`.`IBLOCK_ELEMENT_ID` = `mytable_street`.`ID`
    LEFT JOIN `b_iblock_section` `mytable_city` 
        ON `mytable_street`.`IBLOCK_SECTION_ID` = `mytable_city`.`ID`
    INNER JOIN `b_iblock_element_property` `mytable_archive` 
        ON `mytable`.`ID` = `mytable_archive`.`IBLOCK_ELEMENT_ID`
        AND `mytable_archive`.`IBLOCK_PROPERTY_ID` = 321
    WHERE `mytable`.`IBLOCK_ID` = 7
        AND (`mytable_archive`.`VALUE_NUM` IS NULL OR `mytable_archive`.`VALUE_NUM` = 0)
        AND (`mytable_city`.`NAME` IS NOT NULL AND LENGTH(`mytable_city`.`NAME`) > 0)

时间:1.82977 秒

解释

id  select_type     table               type    possible_keys                   key                     key_len     ref                                                     rows    Extra
1   SIMPLE      mytable_housetype_id    ref     IBLOCK_PROPERTY_ID              IBLOCK_PROPERTY_ID              4   const                                                   4   Using where; Using temporary
1   SIMPLE      mytable_planing         eq_ref  PRIMARY                         PRIMARY                         4   tesserbd.mytable_housetype_id.IBLOCK_ELEMENT_ID         1    
1   SIMPLE      mytable_housetype       ref     XML_HASH                        XML_HASH                        96  tesserbd.mytable_housetype_id.VALUE_HASH                1   Using index
1   SIMPLE      mytable_planing_id      ref     VALUE_HASH                      VALUE_HASH                      96  tesserbd.mytable_planing.XML_HASH                       15  Using where
1   SIMPLE      mytable_archive         ref     ix_iblock_element_property_1    ix_iblock_element_property_1    8   tesserbd.mytable_planing_id.IBLOCK_ELEMENT_ID,const     1   Using where
1   SIMPLE      mytable_street_id       ref     PROP_60_HASH                    PROP_60_HASH                    96  tesserbd.mytable_housetype_id.VALUE_HASH                185 Using where
1   SIMPLE      mytable                 eq_ref  PRIMARY                         PRIMARY                         4   tesserbd.mytable_planing_id.IBLOCK_ELEMENT_ID           1   Using where
1   SIMPLE      mytable_street          eq_ref  PRIMARY                         PRIMARY                         4   tesserbd.mytable_street_id.IBLOCK_ELEMENT_ID            1    
1   SIMPLE      mytable_city            eq_ref  PRIMARY                         PRIMARY                         4   tesserbd.mytable_street.IBLOCK_SECTION_ID               1   Using where

第二个有不同的选择和在某些字段上的位置

SELECT SQL_NO_CACHE
    DISTINCT `mytable_planing`.`NAME` AS `FILTER_CITY`
FROM `b_iblock_element` `mytable` 
    LEFT JOIN `b_iblock_element_property` `mytable_planing_id` 
        ON `mytable`.`ID` = `mytable_planing_id`.`IBLOCK_ELEMENT_ID`
        AND `mytable_planing_id`.`IBLOCK_PROPERTY_ID` = 70
    INNER JOIN `b_iblock_element` `mytable_planing` 
        ON `mytable_planing_id`.`VALUE_HASH` = `mytable_planing`.`XML_HASH`
    LEFT JOIN `b_iblock_element_property` `mytable_housetype_id` 
        ON `mytable_planing`.`ID` = `mytable_housetype_id`.`IBLOCK_ELEMENT_ID`
        AND `mytable_housetype_id`.`IBLOCK_PROPERTY_ID` = 46
    INNER JOIN `b_iblock_element` `mytable_housetype` 
        ON `mytable_housetype_id`.`VALUE_HASH` = `mytable_housetype`.`XML_HASH`
    LEFT JOIN `b_iblock_element_prop_s4` `mytable_street_id` 
        ON `mytable_street_id`.`PROP_60_HASH` = `mytable_housetype`.`XML_HASH`
    INNER JOIN `b_iblock_element` `mytable_street` 
        ON `mytable_street_id`.`IBLOCK_ELEMENT_ID` = `mytable_street`.`ID`
    LEFT JOIN `b_iblock_section` `mytable_city` 
        ON `mytable_street`.`IBLOCK_SECTION_ID` = `mytable_city`.`ID`
    INNER JOIN `b_iblock_element_property` `mytable_archive` 
        ON `mytable`.`ID` = `mytable_archive`.`IBLOCK_ELEMENT_ID`
        AND `mytable_archive`.`IBLOCK_PROPERTY_ID` = 321
    WHERE `mytable`.`IBLOCK_ID` = 7
        AND (`mytable_archive`.`VALUE_NUM` IS NULL OR `mytable_archive`.`VALUE_NUM` = 0)
        AND (`mytable_planing`.`NAME` IS NOT NULL AND LENGTH(`mytable_planing`.`NAME`) > 0)

时间:0.00206 秒

解释

id  select_type     table               type    possible_keys                   key                     key_len     ref                                                     rows    Extra
1   SIMPLE      mytable_housetype_id    ref     IBLOCK_PROPERTY_ID              IBLOCK_PROPERTY_ID              4   const                                                   4   Using where; Using temporary
1   SIMPLE      mytable_planing         eq_ref  PRIMARY                         PRIMARY                         4   tesserbd.mytable_housetype_id.IBLOCK_ELEMENT_ID         1   Using where
1   SIMPLE      mytable_housetype       ref     XML_HASH                        XML_HASH                        96  tesserbd.mytable_housetype_id.VALUE_HASH                1   Using index; Distinct
1   SIMPLE      mytable_planing_id      ref     VALUE_HASH                      VALUE_HASH                      96  tesserbd.mytable_planing.XML_HASH                       15  Using where; Distinct
1   SIMPLE      mytable                 eq_ref  PRIMARY,ix_iblock_element_1     PRIMARY                         4   tesserbd.mytable_planing_id.IBLOCK_ELEMENT_ID           1   Using where; Distinct
1   SIMPLE      mytable_archive         ref     ix_iblock_element_property_1    ix_iblock_element_property_1    8   tesserbd.mytable_planing_id.IBLOCK_ELEMENT_ID,const     1   Using where; Distinct
1   SIMPLE      mytable_street_id       ref     PROP_60_HASH                    PROP_60_HASH                    96  tesserbd.mytable_housetype_id.VALUE_HASH                185 Using where; Distinct
1   SIMPLE      mytable_street          eq_ref  PRIMARY                         PRIMARY                         4   tesserbd.mytable_street_id.IBLOCK_ELEMENT_ID            1   Distinct
1   SIMPLE      mytable_city            eq_ref  PRIMARY                         PRIMARY                         4   tesserbd.mytable_street.IBLOCK_SECTION_ID               1   Using index; Distinct

仅在 extra 上不同 - first 没有 distinct

为什么?

我尝试在不同的字段和字段组合上添加索引 - 但没有给出结果。

如有任何帮助,我将不胜感激

最佳答案

我找到了解决方案。加几个条件就可以了。谢谢大家

关于mysql - 为什么不同的执行sql时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37574868/

相关文章:

mysql - sql根据具有重复值的列选择行,但对它们进行明确的排序

java - 创建名称为 'mainController' : Unsatisfied dependency expressed through field 'userRepository' 的 bean 时出错

php - 如果我正在运行 WAMP/MAMP/LAMP 堆栈,是否必须使用 PHP?

macos - 如何在 Mac OS 上的 XAMPP 下运行 mysqldump

mysql - SQL 查询未获得包含多个 AND 的结果

java - org.postgresql.util.PSQLException : ERROR: syntax error at or near "7"

mysql - 如何在 MySQL 中查找重复值和更新值

python - Datalab 到 BigQuery - 将变量值插入 SQL 中

postgresql - 如何使用最大字段获得不同的结果

sql - 为什么 hibernate hql distinct 会导致 sql 在左连接中不同?