优化Mysql:获取最新的销售状态

Posted

技术标签:

【中文标题】优化Mysql:获取最新的销售状态【英文标题】:optimize Mysql: get latest status of the sale 【发布时间】:2012-10-17 17:45:04 【问题描述】:

在以下查询中,我显示了销售的最新状态(按阶段,在本例中为数字 3)。该查询基于销售状态历史记录中的子查询:

SELECT v.id_sale, 
IFNULL((
    SELECT (CASE WHEN IFNULL( vec.description, '' ) = ''
                    THEN ve.name
                    ELSE vec.description
                    END)
    FROM t_record veh
    INNER JOIN t_state_campaign vec ON vec.id_state_campaign = veh.id_state_campaign
    INNER JOIN t_state ve ON ve.id_state = vec.id_state
    WHERE veh.id_sale = v.id_sale
    AND vec.id_stage = 3
    ORDER BY veh.id_record DESC
    LIMIT 1
), 'x') sale_state_3
FROM t_sale v
INNER JOIN t_quarters sd ON v.id_quarters = sd.id_quarters
WHERE 1 =1
AND v.flag =1
AND v.id_quarters =4
AND EXISTS (
    SELECT '1'
    FROM t_record
    WHERE id_sale = v.id_sale
    LIMIT 1
)

查询延迟0.0057seg并显示1011条记录

因为我必须按州名过滤销售额,因为它必须在 where 子句中重复子查询,所以我决定使用联接更改相同的查询。在这种情况下,我使用 MAX 函数来获取最新状态:

SELECT
v.id_sale,
IFNULL(veh3.State3,'x') AS sale_state_3
FROM t_sale v
INNER JOIN t_quarters sd ON v.id_quarters = sd.id_quarters
LEFT JOIN (
    SELECT veh.id_sale, 
    (CASE WHEN IFNULL(vec.description,'') = '' 
        THEN ve.name
        ELSE vec.description END) AS State3
    FROM t_record veh
    INNER JOIN (
        SELECT id_sale, MAX(id_record) AS max_rating
                FROM(
                    SELECT veh.id_sale, id_record
                    FROM t_record veh
                    INNER JOIN t_state_campaign vec ON vec.id_state_campaign = veh.id_state_campaign AND vec.id_stage = 3
                ) m
            GROUP BY id_sale    
    ) x ON x.max_rating = veh.id_record
    INNER JOIN t_state_campaign vec ON vec.id_state_campaign = veh.id_state_campaign
    INNER JOIN t_state ve ON ve.id_state = vec.id_state
) veh3 ON veh3.id_sale = v.id_sale
WHERE v.flag = 1
AND v.id_quarters = 4

此查询显示相同的结果 (1011)。但问题是它需要 0.0753 秒

查看可能性,我发现了影响查询速度的因素:

AND EXISTS (
    SELECT '1'
    FROM t_record
    WHERE id_sale = v.id_sale
    LIMIT 1
)

如果我删除此子句,则两个查询的时间延迟相同...为什么效果更好?有没有办法在连接中使用这个子句?我希望你的帮助。

编辑

我将分别显示每个查询的 EXPLAIN 结果:

第一季度:

第二季度:

【问题讨论】:

【参考方案1】:

有趣,所以那条小语句基本上确定了 t_record.id_sale 和 t_sale.id_sale 是否匹配。

为什么这会使您的查询运行得更快?因为 where 语句在 select 语句中的 subSelects 之前应用,所以如果没有记录要与 sale 一起去,那么它不会打扰处理 subSelect。这让你有一些时间。所以这就是它工作得更好的原因。

它会在您的联接语法中起作用吗?如果没有要测试的表格,我真的不知道,但是您始终可以将其应用到最后并找出答案。将关键字 EXPLAIN 添加到查询的开头,您将获得一个执行计划,这将帮助您优化事物。在连接语法中获得更好结果的最佳方法可能是向表中添加一些索引。

但我问你,这还有必要吗?您有一个查询在

【讨论】:

感谢您的回复。对我来说,这是很重要的时间,原因很简单,我显示的查询只是销售状态。真实查询显示每个阶段的不同状态(每个子查询/连接),如果我们添加时间,查询可能需要 1.5 秒。反对 0.3xxx 秒。因此,知道是否有任何方法可以优化连接会很有趣。索引表例如在 Table t_record 中:i_id_record, i_id_state_campaign, i_id_sale...

以上是关于优化Mysql:获取最新的销售状态的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 获取所有商店的最新条目

从更优化的 2 个表中获取 MySQL 的最新记录 [重复]

优化最新时间戳查询mysql

如何从更新表中获取最新状态并将其与 MySQL 中的详细信息表连接?

MySQL中最新订单状态的SQL查询

如何将结果集限制为仅 JOIN 中的最新实例