【发布时间】: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
仅在额外上有所不同 - 首先没有不同
为什么?
我尝试在不同的字段和字段组合上添加索引 - 但没有给出结果。
如果有任何帮助,我将不胜感激
【问题讨论】:
-
索引的简单经验法则:查询中“决策”上下文中使用的任何字段都应该被索引。这意味着如果在
where、join、order 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