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