Mysql 为什么额外的连接会使我的查询速度减慢+;10秒?

Mysql 为什么额外的连接会使我的查询速度减慢+;10秒?,mysql,Mysql,我正在对几个MySQL 5.7表中的数据进行计算,其中一个表(mks)中有+2亿行。所需结果在13秒内返回,并应降至亚秒范围。据我所知,索引设置正确 问题似乎是与包含商户名称(仅20行)的表m的连接。如果我离开这个连接,查询将在大约1.5秒内运行 以下是我的简化查询: SELECT mks.DATE, m.name, -- name of merchant mks.merchant_id, -- id of merchant (SUM ( CASE

我正在对几个MySQL 5.7表中的数据进行计算,其中一个表(mks)中有+2亿行。所需结果在13秒内返回,并应降至亚秒范围。据我所知,索引设置正确

问题似乎是与包含商户名称(仅20行)的表
m
的连接。如果我离开这个连接,查询将在大约1.5秒内运行

以下是我的简化查询:

SELECT
    mks.DATE,
    m.name, -- name of merchant
    mks.merchant_id, -- id of merchant
    (SUM (
        CASE
            WHEN
               p.MANUFACTURER_ID  = 123
            THEN ((72 / mks.TEST)*0.6)
        END )
    /
    SUM (
        ((72 / mks.TEST)*0.6)
    )
    )  AS 'RESULT'
FROM mks
JOIN p on mks.ARTICLE_ID = p.SKU
JOIN m ON mks.MERCHANT_ID = m.id
WHERE
    mks.KW_ID IN (
        264,2053,3902,5314,5315,5316,5323,5324,5506,5643,6019
    )
    AND FIND_IN_SET(mks.MERCHANT_ID, '2,1')
    AND mks.DATE = curdate() - interval  1 day
GROUP BY
   mks.MERCHANT_ID
使用商户名称(13s+)解释查询

1,PRIMARY,m,NULL,ALL,PRIMARY,NULL,NULL,11100,使用where;使用临时设备;使用文件排序
1,主要,mks,NULL,参考,“唯一,关键字,mks_日期”,唯一,2,m.id,37276,3.07,使用索引条件
1,主,空,等式参考,3,mks.KW\u ID,1100,空
1,PRIMARY,p,NULL,eq_ref,PRIMARY,PRIMARY,24,mks.物品ID,1100,使用其中
2、物化、空、全部、空、空、空、空、空、2238100、空
3,派生,p,NULL,ref,“主,产品指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数;使用临时设备;使用文件排序
3,派生,mk,NULL,参考,“主要,制造商关键字,状态索引”,制造商关键字,状态索引,25,“常量,p.SKU”,9100,使用索引
3,派生,mc,NULL,等式参考,主,主,3,mk.KW_ID,1100,使用索引
无商户名称查询说明(1.5s):

1,主,空,全部,空,空,空,空,空,空,空,100,使用临时;使用文件排序
1,主,mks,NULL,参考,“唯一,关键字,mks_日期”,关键字,4,.KW_ID,1061,3.07,使用where
1,PRIMARY,p,NULL,eq_ref,PRIMARY,PRIMARY,24,mks.物品ID,1100,使用其中
2、物化、空、全部、空、空、空、空、空、2238100、空
3,派生,p,NULL,ref,“主,产品指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数指数;使用临时设备;使用文件排序
3,派生,mk,NULL,参考,“主要,制造商关键字,状态索引”,制造商关键字,状态索引,25,“常量,p.SKU”,9100,使用索引
3,派生,mc,NULL,等式参考,主,主,3,mk.KW_ID,1100,使用索引

到目前为止,我还不明白为什么这个连接会导致这样的延迟,因为最终结果只是商家的名字加上共同响应的结果。获取名称会延迟10秒以上。

FIND\u IN\u SET
的效率不如
中的等效

您得到了一半的答案--不使用
商户
作为派生表进行查询,然后
加入
商户
以获取
名称

在我尝试深入挖掘之前,请检查
EXPLAIN
和查询——我在查询中没有看到“派生”表,但它在
EXPLAIN
中。我希望看到
来自(选择…
加入(选择…
)。是否涉及任何
视图


另外,请提供表格大小(大约行数)和
SHOW CREATE table

问题,这些问题询问“为什么我的查询量低”,但不包括执行计划,很难或不可能回答。展示计划你的索引是什么,给我们展示你的执行计划。你是说“解释”的输出吗?我更新了我的问题并添加了解释的输出。谢谢你,瑞克,这为我解决了问题。现在查询运行速度约为1.5秒。我在当前选择中使用join进行了选择。不知道为什么这比直接连接更快,但它现在起作用了。
1,PRIMARY,m,NULL,ALL,PRIMARY,NULL,NULL,NULL,11,100,Using where; Using temporary; Using filesort
1,PRIMARY,mks,NULL,ref,"unique,keywords,mks_date",unique,2,m.id,37276,3.07,Using index condition
1,PRIMARY,<subquery2>,NULL,eq_ref,<auto_key>,<auto_key>,3,mks.KW_ID,1,100,NULL
1,PRIMARY,p,NULL,eq_ref,PRIMARY,PRIMARY,24,mks.ARTICLE_ID,1,100,Using where
2,MATERIALIZED,<derived3>,NULL,ALL,NULL,NULL,NULL,NULL,2238,100,NULL
3,DERIVED,p,NULL,ref,"PRIMARY,products_index_0",products_index_0,4,const,231,100,Using index; Using temporary; Using filesort
3,DERIVED,mk,NULL,ref,"PRIMARY,manufacturers_keywords_STATUS_index",manufacturers_keywords_STATUS_index,25,"const,p.SKU",9,100,Using index
3,DERIVED,mc,NULL,eq_ref,PRIMARY,PRIMARY,3,mk.KW_ID,1,100,Using index
1,PRIMARY,<subquery2>,NULL,ALL,NULL,NULL,NULL,NULL,NULL,100,Using temporary; Using filesort
1,PRIMARY,mks,NULL,ref,"unique,keywords,mks_date",keywords,4,<subquery2>.KW_ID,1061,3.07,Using where
1,PRIMARY,p,NULL,eq_ref,PRIMARY,PRIMARY,24,mks.ARTICLE_ID,1,100,Using where
2,MATERIALIZED,<derived3>,NULL,ALL,NULL,NULL,NULL,NULL,2238,100,NULL
3,DERIVED,p,NULL,ref,"PRIMARY,products_index_0",products_index_0,4,const,231,100,Using index; Using temporary; Using filesort
3,DERIVED,mk,NULL,ref,"PRIMARY,manufacturers_keywords_STATUS_index",manufacturers_keywords_STATUS_index,25,"const,p.SKU",9,100,Using index
3,DERIVED,mc,NULL,eq_ref,PRIMARY,PRIMARY,3,mk.KW_ID,1,100,Using index