MySQL 查询非常慢。索引问题?

-1 mysql query

我有一个这样的查询:

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 缓存。

ype*_*eᵀᴹ 5

首先以一种我希望可读的形式重写您的查询:

选择

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)

可以改变,有来自两个表而不是三个表的列。