【问题标题】:Why different execute sql time?为什么不同的执行sql时间?
【发布时间】:2016-10-01 04:30:35
【问题描述】:

这里 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

仅在额外上有所不同 - 首先没有不同

为什么?

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

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

【问题讨论】:

  • 索引的简单经验法则:查询中“决策”上下文中使用的任何字段都应该被索引。这意味着如果在wherejoinorder by 等中使用了一个字段,则应该对其进行索引。
  • @MarcB 我知道,所有字段都有索引,每个字段都有索引,并且在一些组合上,如 IBLOCK_ELEMENT_ID、IBLOCK_PROPERTY_ID 用于此 ON mytable_planing.ID = mytable_housetype_id.IBLOCK_ELEMENT_ID 和 @987654332 @.IBLOCK_PROPERTY_ID = 46

标签: mysql sql distinct explain


【解决方案1】:

第二个解释计划展示

1   SIMPLE mytable_city  ........  Using index; Distinct

在第一个

1   SIMPLE      mytable_city        Using where

这意味着在第二次您访问索引中的某些列存储(也)时,首先不是 ..

是否使用和索引对于性能/执行时间很重要

在第一个你选择

mytable_city

`mytable_city`.`NAME` AS `FILTER_CITY`

在你选择的那一秒

mytable_planing

mytable_planing.NAME AS FILTER_CITY

您为不同的表格选择日期..

【讨论】:

  • 但是两个查询都使用相同的列和表...仅在返回字段上有所不同。为什么第二次使用索引但首先不使用.. 仅解释一个行位置和额外字段的区别。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2013-08-12
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多