我有一个这样的查询:
SELECT
BE.NAME as NAME,
BE.PREVIEW_TEXT as PREVIEW_TEXT,
BE.ID as ID,
FPV1.VALUE as PROPERTY_COUNTRY_VALUE,
FPV1.ID as PROPERTY_COUNTRY_VALUE_ID,
FPV2.VALUE as PROPERTY_TOUR_TYPE_VALUE,
FPV2.ID as PROPERTY_TOUR_TYPE_VALUE_ID,
FPV3.VALUE as PROPERTY_DAYS_VALUE,
FPV3.ID as PROPERTY_DAYS_VALUE_ID,
FPV4.VALUE as PROPERTY_PRICE_VALUE,
FPV4.ID as PROPERTY_PRICE_VALUE_ID,
FPV5.VALUE as PROPERTY_CURRENCY_VALUE,
FPV5.ID as PROPERTY_CURRENCY_VALUE_ID,
FPV6.VALUE as PROPERTY_DATE_FROM_VALUE,
FPV6.ID as PROPERTY_DATE_FROM_VALUE_ID,
FPV7.VALUE as PROPERTY_DATE_TO_VALUE,
FPV7.ID as PROPERTY_DATE_TO_VALUE_ID,
FPV8.VALUE as PROPERTY_FLIGHT_FROM_VALUE,
FPV8.ID as PROPERTY_FLIGHT_FROM_VALUE_ID,
FPV9.VALUE as PROPERTY_MT_ID_VALUE,
FPV9.ID as PROPERTY_MT_ID_VALUE_ID,
FPV10.VALUE as PROPERTY_PRICE_FILE_VALUE,
FPV10.ID as PROPERTY_PRICE_FILE_VALUE_ID,
BE.PREVIEW_PICTURE as PREVIEW_PICTURE,
FPV11.VALUE as PROPERTY_PRICE_HAND_VALUE,
FPV11.ID as PROPERTY_PRICE_HAND_VALUE_ID,
FPV0.VALUE as PROPERTY_MAN_PRICE_VALUE,
FPV0.ID as PROPERTY_MAN_PRICE_VALUE_ID,
FPV12.VALUE as PROPERTY_ROOM_PRICE_VALUE,
FPV12.ID as PROPERTY_ROOM_PRICE_VALUE_ID,
FPEN0.VALUE as PROPERTY_SPEC_OFFER_VALUE,
FPEN0.ID as PROPERTY_SPEC_OFFER_ENUM_ID,
FPV13.ID as PROPERTY_SPEC_OFFER_VALUE_ID,
FPV14.VALUE as PROPERTY_ENGL_NAME_VALUE,
FPV14.ID as PROPERTY_ENGL_NAME_VALUE_ID,
FPEN1.VALUE as PROPERTY_EARLY_BOOKING_VALUE,
FPEN1.ID as PROPERTY_EARLY_BOOKING_ENUM_ID,
FPV15.ID as PROPERTY_EARLY_BOOKING_VALUE_ID,
FPEN2.VALUE as PROPERTY_SUPER_JET_VALUE,
FPEN2.ID as PROPERTY_SUPER_JET_ENUM_ID,
FPV16.ID as PROPERTY_SUPER_JET_VALUE_ID,
FPEN3.VALUE as PROPERTY_BEST_PRICE_VALUE,
FPEN3.ID as PROPERTY_BEST_PRICE_ENUM_ID,
FPV17.ID as PROPERTY_BEST_PRICE_VALUE_ID,
FPEN4.VALUE as PROPERTY_EVENT_VALUE,
FPEN4.ID as PROPERTY_EVENT_ENUM_ID,
FPV18.ID as PROPERTY_EVENT_VALUE_ID,
BE.SORT as SORT,
BE.PREVIEW_TEXT_TYPE as PREVIEW_TEXT_TYPE
FROM b_iblock B
INNER JOIN b_lang L ON B.LID=L.LID
INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
LEFT JOIN b_iblock_property FP0 ON FP0.IBLOCK_ID = B.ID
AND FP0.CODE='MAN_PRICE'
INNER JOIN b_iblock_property FP1 ON FP1.IBLOCK_ID = B.ID
AND FP1.CODE='COUNTRY'
INNER JOIN b_iblock_property FP2 ON FP2.IBLOCK_ID = B.ID
AND FP2.CODE='TOUR_TYPE'
LEFT JOIN b_iblock_property FP3 ON FP3.IBLOCK_ID = B.ID
AND FP3.CODE='DAYS'
LEFT JOIN b_iblock_property FP4 ON FP4.IBLOCK_ID = B.ID
AND FP4.CODE='PRICE'
LEFT JOIN b_iblock_property FP5 ON FP5.IBLOCK_ID = B.ID
AND FP5.CODE='CURRENCY'
LEFT JOIN b_iblock_property FP6 ON FP6.IBLOCK_ID = B.ID
AND FP6.CODE='DATE_FROM'
LEFT JOIN b_iblock_property FP7 ON FP7.IBLOCK_ID = B.ID
AND FP7.CODE='DATE_TO'
INNER JOIN b_iblock_property FP8 ON FP8.IBLOCK_ID = B.ID
AND FP8.CODE='FLIGHT_FROM'
LEFT JOIN b_iblock_property FP9 ON FP9.IBLOCK_ID = B.ID
AND FP9.CODE='MT_ID'
LEFT JOIN b_iblock_property FP10 ON FP10.IBLOCK_ID = B.ID
AND FP10.CODE='PRICE_FILE'
LEFT JOIN b_iblock_property FP11 ON FP11.IBLOCK_ID = B.ID
AND FP11.CODE='PRICE_HAND'
LEFT JOIN b_iblock_property FP12 ON FP12.IBLOCK_ID = B.ID
AND FP12.CODE='ROOM_PRICE'
LEFT JOIN b_iblock_property FP13 ON FP13.IBLOCK_ID = B.ID
AND FP13.CODE='SPEC_OFFER'
LEFT JOIN b_iblock_property FP14 ON FP14.IBLOCK_ID = B.ID
AND FP14.CODE='ENGL_NAME'
LEFT JOIN b_iblock_property FP15 ON FP15.IBLOCK_ID = B.ID
AND FP15.CODE='EARLY_BOOKING'
LEFT JOIN b_iblock_property FP16 ON FP16.IBLOCK_ID = B.ID
AND FP16.CODE='SUPER_JET'
LEFT JOIN b_iblock_property FP17 ON FP17.IBLOCK_ID = B.ID
AND FP17.CODE='BEST_PRICE'
LEFT JOIN b_iblock_property FP18 ON FP18.IBLOCK_ID = B.ID
AND FP18.CODE='EVENT'
LEFT JOIN b_iblock_element_property FPV0 ON
FPV0.IBLOCK_PROPERTY_ID = FP0.ID
AND FPV0.IBLOCK_ELEMENT_ID = BE.ID
INNER JOIN b_iblock_element_property FPV1 ON
FPV1.IBLOCK_PROPERTY_ID = FP1.ID
AND FPV1.IBLOCK_ELEMENT_ID = BE.ID
INNER JOIN b_iblock_element_property FPV2 ON
FPV2.IBLOCK_PROPERTY_ID = FP2.ID
AND FPV2.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV3
ON FPV3.IBLOCK_PROPERTY_ID = FP3.ID
AND FPV3.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV4
ON FPV4.IBLOCK_PROPERTY_ID = FP4.ID
AND FPV4.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV5
ON FPV5.IBLOCK_PROPERTY_ID = FP5.ID
AND FPV5.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV6
ON FPV6.IBLOCK_PROPERTY_ID = FP6.ID
AND FPV6.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV7
ON FPV7.IBLOCK_PROPERTY_ID = FP7.ID
AND FPV7.IBLOCK_ELEMENT_ID = BE.ID
INNER JOIN b_iblock_element_property FPV8
ON FPV8.IBLOCK_PROPERTY_ID = FP8.ID
AND FPV8.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV9
ON FPV9.IBLOCK_PROPERTY_ID = FP9.ID
AND FPV9.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV10
ON FPV10.IBLOCK_PROPERTY_ID = FP10.ID
AND FPV10.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV11
ON FPV11.IBLOCK_PROPERTY_ID = FP11.ID
AND FPV11.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV12
ON FPV12.IBLOCK_PROPERTY_ID = FP12.ID
AND FPV12.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV13
ON FPV13.IBLOCK_PROPERTY_ID = FP13.ID
AND FPV13.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV14
ON FPV14.IBLOCK_PROPERTY_ID = FP14.ID
AND FPV14.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV15
ON FPV15.IBLOCK_PROPERTY_ID = FP15.ID
AND FPV15.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV16
ON FPV16.IBLOCK_PROPERTY_ID = FP16.ID
AND FPV16.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV17
ON FPV17.IBLOCK_PROPERTY_ID = FP17.ID
AND FPV17.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_element_property FPV18
ON FPV18.IBLOCK_PROPERTY_ID = FP18.ID
AND FPV18.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_property_enum FPEN0
ON FPEN0.PROPERTY_ID = FPV13.IBLOCK_PROPERTY_ID
AND FPV13.VALUE_ENUM = FPEN0.ID
LEFT JOIN b_iblock_property_enum FPEN1
ON FPEN1.PROPERTY_ID = FPV15.IBLOCK_PROPERTY_ID
AND FPV15.VALUE_ENUM = FPEN1.ID
LEFT JOIN b_iblock_property_enum FPEN2
ON FPEN2.PROPERTY_ID = FPV16.IBLOCK_PROPERTY_ID
AND FPV16.VALUE_ENUM = FPEN2.ID
LEFT JOIN b_iblock_property_enum FPEN3
ON FPEN3.PROPERTY_ID = FPV17.IBLOCK_PROPERTY_ID
AND FPV17.VALUE_ENUM = FPEN3.ID
LEFT JOIN b_iblock_property_enum FPEN4
ON FPEN4.PROPERTY_ID = FPV18.IBLOCK_PROPERTY_ID
AND FPV18.VALUE_ENUM = FPEN4.ID
INNER JOIN
(
SELECT DISTINCT BSE.IBLOCK_ELEMENT_ID
FROM b_iblock_section_element BSE
INNER JOIN b_iblock_section BS
ON BSE.IBLOCK_SECTION_ID = BS.ID
WHERE ((BS.ID IN (137)))
) BES ON BES.IBLOCK_ELEMENT_ID = BE.ID
WHERE 1=1 AND ( ((((BE.ACTIVE='Y'))))
AND (((BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL)
AND (BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL)))
AND ((((BE.IBLOCK_ID = '6'))))
AND ( ( (((FPV13.VALUE_ENUM IS NULL))) )
AND ( (((FPV15.VALUE_ENUM IS NULL))) )
AND ( (((FPV17.VALUE_ENUM IS NULL))) )
AND ( (((FPV16.VALUE_ENUM IS NULL))) ) )
AND ((((FPV1.VALUE_NUM = '4656'))))
AND ((((FPV2.VALUE_NUM = '36997'))))
AND (((FPV8.VALUE_NUM IN ('7191', '7190')))) )
AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
ORDER BY BE.SORT desc ,FPV0.VALUE_NUM asc
Run Code Online (Sandbox Code Playgroud)
它看起来很吓人,但它最多应该在几秒钟内起作用。
问题是它永远运行。嗯,900多秒!
这是对其进行扩展解释的结果:
1 PRIMARY B const PRIMARY PRIMARY 4 const 1 Using temporary; Using filesort
1 PRIMARY L const PRIMARY PRIMARY 2 const 1 Using index
1 PRIMARY FP0 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP2 ref PRIMARY,ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1 Using where
1 PRIMARY FP3 index_merge ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2,ix_iblock_property_1 53,4 NULL 1 Using intersect(ix_iblock_property_2,ix_iblock_property_1); Using where; Using index
1 PRIMARY FP4 index_merge ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2,ix_iblock_property_1 53,4 NULL 1 Using intersect(ix_iblock_property_2,ix_iblock_property_1); Using where; Using index
1 PRIMARY FP5 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP6 index_merge ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2,ix_iblock_property_1 53,4 NULL 1 Using intersect(ix_iblock_property_2,ix_iblock_property_1); Using where; Using index
1 PRIMARY FP7 index_merge ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2,ix_iblock_property_1 53,4 NULL 1 Using intersect(ix_iblock_property_2,ix_iblock_property_1); Using where; Using index
1 PRIMARY FP8 index_merge PRIMARY,ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2,ix_iblock_property_1 53,4 NULL 1 Using intersect(ix_iblock_property_2,ix_iblock_property_1); Using where; Using index
1 PRIMARY FP9 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_1 4 bitrix.FP2.IBLOCK_ID 2
1 PRIMARY FP10 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP11 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP12 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP13 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP14 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP15 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP16 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP17 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY FP18 ref ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_2 53 const 1
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 49
1 PRIMARY BE eq_ref PRIMARY,ix_iblock_element_1,ix_iblock_element_4,ix_iblock_element_3,date_active_from_x,ix_iblock_element_code PRIMARY 4 BES.IBLOCK_ELEMENT_ID 1 Using where
1 PRIMARY FPV2 ref ix_iblock_element_property_1,ix_iblock_element_property_2,VALUE_NUM,ix_iblock_element_prop_num,ix_iblock_element_property_3 ix_iblock_element_property_1 8 BES.IBLOCK_ELEMENT_ID,bitrix.FP2.ID 1 Using where
1 PRIMARY FPV8 ref ix_iblock_element_property_1,ix_iblock_element_property_2,VALUE_NUM,ix_iblock_element_prop_num,ix_iblock_element_property_3 ix_iblock_element_property_1 8 BES.IBLOCK_ELEMENT_ID,bitrix.FP8.ID 1 Using where
1 PRIMARY FPV0 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 BES.IBLOCK_ELEMENT_ID,bitrix.FP0.ID 1
1 PRIMARY FPV3 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV8.IBLOCK_ELEMENT_ID,bitrix.FP3.ID 1
1 PRIMARY FPV4 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP4.ID 1
1 PRIMARY FPV5 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.BE.ID,bitrix.FP5.ID 1
1 PRIMARY FPV6 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV8.IBLOCK_ELEMENT_ID,bitrix.FP6.ID 1
1 PRIMARY FPV7 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV8.IBLOCK_ELEMENT_ID,bitrix.FP7.ID 1
1 PRIMARY FPV9 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV8.IBLOCK_ELEMENT_ID,bitrix.FP9.ID 1
1 PRIMARY FPV10 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV8.IBLOCK_ELEMENT_ID,bitrix.FP10.ID 1
1 PRIMARY FPV11 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP11.ID 1
1 PRIMARY FPV12 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP12.ID 1
1 PRIMARY FPV13 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP13.ID 1 Using where
1 PRIMARY FPV14 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP14.ID 1
1 PRIMARY FPV15 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP15.ID 1 Using where
1 PRIMARY FPV16 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP16.ID 1 Using where
1 PRIMARY FPV17 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP17.ID 1 Using where
1 PRIMARY FPV18 ref ix_iblock_element_property_1,ix_iblock_element_property_2,ix_iblock_element_property_3 ix_iblock_element_property_1 8 bitrix.FPV2.IBLOCK_ELEMENT_ID,bitrix.FP18.ID 1
1 PRIMARY FP1 index_merge PRIMARY,ix_iblock_property_1,ix_iblock_property_2 ix_iblock_property_1,ix_iblock_property_2 4,53 NULL 2 Using intersect(ix_iblock_property_1,ix_iblock_property_2); Using where; Using index
1 PRIMARY FPV1 ref ix_iblock_element_property_1,ix_iblock_element_property_2,VALUE_NUM,ix_iblock_element_prop_num,ix_iblock_element_property_3 ix_iblock_element_property_1 8 BES.IBLOCK_ELEMENT_ID,bitrix.FP1.ID 1 Using where
1 PRIMARY FPEN0 eq_ref PRIMARY,ux_iblock_property_enum PRIMARY 4 bitrix.FPV13.VALUE_ENUM 1
1 PRIMARY FPEN1 eq_ref PRIMARY,ux_iblock_property_enum PRIMARY 4 bitrix.FPV15.VALUE_ENUM 1
1 PRIMARY FPEN2 eq_ref PRIMARY,ux_iblock_property_enum PRIMARY 4 bitrix.FPV16.VALUE_ENUM 1
1 PRIMARY FPEN3 eq_ref PRIMARY,ux_iblock_property_enum PRIMARY 4 bitrix.FPV17.VALUE_ENUM 1
1 PRIMARY FPEN4 eq_ref PRIMARY,ux_iblock_property_enum PRIMARY 4 bitrix.FPV18.VALUE_ENUM 1
2 DERIVED BS const PRIMARY PRIMARY 4 1 Using index
2 DERIVED BSE ref ux_iblock_section_element ux_iblock_section_element 4 49 Using where; Using index
Run Code Online (Sandbox Code Playgroud)
为什么要花这么长时间来处理这样的查询?
以下是表的索引:
b_iblock (35 rows)
PRIMARY KEY (`ID`),
KEY `ix_iblock` (`IBLOCK_TYPE_ID`,`LID`,`ACTIVE`)
b_iblock_element (~6 millions rows)
PRIMARY KEY (`ID`),
KEY `ix_iblock_element_1` (`IBLOCK_ID`,`IBLOCK_SECTION_ID`),
KEY `ix_iblock_element_4` (`IBLOCK_ID`,`XML_ID`,`WF_PARENT_ELEMENT_ID`),
KEY `ix_iblock_element_3` (`WF_PARENT_ELEMENT_ID`),
KEY `date_active_from_x` (`ACTIVE_FROM`,`ID`),
KEY `ix_iblock_element_code` (`IBLOCK_ID`,`CODE`),
KEY `i_iblock_element_code` (`CODE`)
b_iblock_property (166 rows)
PRIMARY KEY (`ID`),
KEY `ix_iblock_property_1` (`IBLOCK_ID`),
KEY `ix_iblock_property_2` (`CODE`)
b_iblock_element_property
PRIMARY KEY (`ID`),
KEY `ix_iblock_element_property_1` (`IBLOCK_ELEMENT_ID`,`IBLOCK_PROPERTY_ID`),
KEY `ix_iblock_element_property_2` (`IBLOCK_PROPERTY_ID`),
KEY `ix_iblock_element_prop_enum` (`VALUE_ENUM`,`IBLOCK_PROPERTY_ID`),
KEY `VALUE_NUM` (`VALUE_NUM`),
KEY `ix_iblock_element_prop_num` (`VALUE_NUM`,`IBLOCK_PROPERTY_ID`),
KEY `ix_iblock_element_property_3` (`IBLOCK_PROPERTY_ID`,`IBLOCK_ELEMENT_ID`)
Run Code Online (Sandbox Code Playgroud)
更新:
此查询由 CMS 系统自动生成。相同的查询在类似的情况下工作得很好。
这个特定的查询返回 0 行作为结果(它是正确的)
今天它只需要 98 毫秒就可以运行。
我需要帮助的是理解为什么它在几天前需要 900 秒才能运行?
为什么其他类似的查询有时需要这么长时间来处理?
我使用 SQL_NO_CACHE 参数执行此查询以防止使用 MySQL 缓存。
首先以一种我希望可读的形式重写您的查询:
选择
SELECT BE.NAME as NAME, BE.PREVIEW_TEXT as PREVIEW_TEXT, BE.ID as ID
, FPV1.VALUE as PROPERTY_COUNTRY_VALUE, FPV1.ID as PROPERTY_COUNTRY_VALUE_ID
--- various FPVxx.VALUE and FPENx.VALUE columns
, FPV18.ID as PROPERTY_EVENT_VALUE_ID
, BE.SORT as SORT, BE.PREVIEW_TEXT_TYPE as PREVIEW_TEXT_TYPE
Run Code Online (Sandbox Code Playgroud)
从
FROM
b_iblock B
INNER JOIN b_lang L ON B.LID=L.LID
INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
LEFT JOIN b_iblock_property FP0 ON FP0.IBLOCK_ID = B.ID AND FP0.CODE='MAN_PRICE'
INNER JOIN b_iblock_property FP1 ON FP1.IBLOCK_ID = B.ID AND FP1.CODE='COUNTRY'
----------- 19 joins, some INNER, some LEFT
LEFT JOIN b_iblock_property FP18 ON FP18.IBLOCK_ID = B.ID AND FP18.CODE='EVENT'
LEFT JOIN b_iblock_element_property FPV0 ON FPV0.IBLOCK_PROPERTY_ID = FP0.ID
AND FPV0.IBLOCK_ELEMENT_ID = BE.ID
INNER JOIN b_iblock_element_property FPV1 ON FPV1.IBLOCK_PROPERTY_ID = FP1.ID
AND FPV1.IBLOCK_ELEMENT_ID = BE.ID
------------ 19 more joins
LEFT JOIN b_iblock_element_property FPV18 ON FPV18.IBLOCK_PROPERTY_ID = FP18.ID
AND FPV18.IBLOCK_ELEMENT_ID = BE.ID
LEFT JOIN b_iblock_property_enum FPEN0
ON FPEN0.PROPERTY_ID = FPV13.IBLOCK_PROPERTY_ID
AND FPV13.VALUE_ENUM = FPEN0.ID
------ 5 joins
LEFT JOIN b_iblock_property_enum FPEN4
ON FPEN4.PROPERTY_ID = FPV18.IBLOCK_PROPERTY_ID
AND FPV18.VALUE_ENUM = FPEN4.ID
INNER JOIN
( SELECT DISTINCT BSE.IBLOCK_ELEMENT_ID
FROM b_iblock_section_element BSE
INNER JOIN b_iblock_section BS
ON BSE.IBLOCK_SECTION_ID = BS.ID
WHERE BS.ID IN (137)
) BES
ON BES.IBLOCK_ELEMENT_ID = BE.ID
Run Code Online (Sandbox Code Playgroud)
在哪里
WHERE 1=1
AND BE.ACTIVE='Y'
AND ( BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL )
AND ( BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL )
AND BE.IBLOCK_ID = '6'
AND FPV13.VALUE_ENUM IS NULL
AND FPV15.VALUE_ENUM IS NULL
AND FPV17.VALUE_ENUM IS NULL
AND FPV16.VALUE_ENUM IS NULL
AND FPV1.VALUE_NUM = '4656'
AND FPV2.VALUE_NUM = '36997'
AND FPV8.VALUE_NUM IN ('7191', '7190')
AND BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL
Run Code Online (Sandbox Code Playgroud)
订购者
ORDER BY
BE.SORT desc
, FPV0.VALUE_NUM asc ;
Run Code Online (Sandbox Code Playgroud)
首先,如果我计算正确,那就是 47 个连接,并且正在接近 MySQL 对 61 个连接的硬限制。所以要小心不要允许添加(许多)更多的条件。
其次,这显然是 EAV 设计,因此优化性能并不是最容易的。我认为主要问题之一是缺少一些复合指数。您也没有告诉我们这些表是使用 MyISAM 还是 InnoDB 引擎。
例如,您在 上没有索引b_iblock_property(CODE, IBLOCK_ID, ID)
。我认为 (19) 类型的连接:
... JOIN b_iblock_property FP0 ON FP0.IBLOCK_ID = B.ID AND FP0.CODE='MAN_PRICE'
Run Code Online (Sandbox Code Playgroud)
将通过该指数得到改善。
通过在b_iblock_element_property
表上添加适当的复合索引,您还可能会看到性能差异,例如:(VALUE_NUM, IBLOCK_PROPERTY_ID, IBLOCK_ELEMENT_ID)
可能还有其他一些。不能 100% 确定哪些会有所帮助,因为需要对您的表(以及您期望的大小)以及您正在访问数据库的各种查询进行测试。您肯定不想添加太多索引。
第三个问题是整体设计。撇开是否应该使用 EAV 不谈 - 假设您无法更改它 - 您应该仔细检查是否可以将某些列组合声明为UNIQUE
以及您拥有的复杂连接条件:
LEFT JOIN b_iblock_element_property FPV0 ON FPV0.IBLOCK_PROPERTY_ID = FP0.ID
AND FPV0.IBLOCK_ELEMENT_ID = BE.ID
Run Code Online (Sandbox Code Playgroud)
可以改变,有来自两个表而不是三个表的列。
归档时间: |
|
查看次数: |
664 次 |
最近记录: |