MySQL使用子查询与多次使用相同计算的效率/最佳实践

MySQL使用子查询与多次使用相同计算的效率/最佳实践,mysql,subquery,Mysql,Subquery,与多次计算相比,使用子查询的最佳实践是什么?到目前为止,我一直在使用子查询,但是当您只需要一个从上一个查询计算出来的变量时,它们看起来太可笑了。在下面的示例中,我们讨论的是一个带子查询的查询和一个带子查询的查询 那么,哪种方法是正确的/最佳实践方法?就个人而言,作为一名程序员,我身上的一切都告诉我使用方法a,因为复制粘贴计算似乎很愚蠢,但同时,子查询并不总是好的,因为它可以使查询使用文件排序而不是索引排序。如果我在这方面有错误,请纠正我 方法a-子查询: 说明: 方法b-重复使用计算: 说明:

与多次计算相比,使用子查询的最佳实践是什么?到目前为止,我一直在使用子查询,但是当您只需要一个从上一个查询计算出来的变量时,它们看起来太可笑了。在下面的示例中,我们讨论的是一个带子查询的查询和一个带子查询的查询

那么,哪种方法是正确的/最佳实践方法?就个人而言,作为一名程序员,我身上的一切都告诉我使用方法a,因为复制粘贴计算似乎很愚蠢,但同时,子查询并不总是好的,因为它可以使查询使用文件排序而不是索引排序。如果我在这方面有错误,请纠正我

方法a-子查询:

说明:

方法b-重复使用计算:

说明:

请注意,DATE_ADDtr.transactiontime、INTERVAL pa.months和MONTH是如何重复3次的,而现在
有了解释,方法B似乎要好得多,但我仍然不喜欢这样一个事实,即它必须进行3次相同的计算,我假设它这样做,并且不会保存结果并替换所有实例本身。

您应该看看MySQL的解释命令:


这告诉你MySQL是如何执行查询的。

解释了添加到OP中的内容-但这仍然没有回答我的问题,这是否真的是最好的方法。这是一个简化的查询,在一个非常高级的查询中可能会有100次重复计算。你可以双向执行,但有效的方法是执行更少的操作。就像任何语言一样。你可以说我要去一个卖苹果、桔子、香蕉的地方。。或者我要去卖水果的商店,或者你可以说我要去杂货店。他们仍然是正确的。B是正确的,因为查询子查询比数学运算慢。
SELECT
    tmp2.*
FROM
    (
        SELECT
            tmp.*,
            (NOW() < tmp.expire_time) as `active`
        FROM
            (
                SELECT
                    tr.orderid,
                    tr.transactiontime,
                    pa.months as `months`,
                    DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH) as `expire_time`
                FROM
                    `transactions` as `tr`
                INNER JOIN
                    `packages` as `pa`
                ON
                    tr.productid = pa.productid
                WHERE
                    tr.isprocessed = '1'
                ORDER BY
                    tr.transactiontime ASC
            ) as `tmp`
    ) as `tmp2`
WHERE
    tmp2.active = 1
SELECT
    tr.orderid,
    tr.transactiontime,
    pa.months as `months`,
    DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH) as `expire_time`,
    (NOW() < DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH)) as `active`
FROM
    `transactions` as `tr`
INNER JOIN
    `packages` as `pa`
ON
    tr.productid = pa.productid
WHERE
    tr.isprocessed = '1'
AND
    (NOW() < DATE_ADD(tr.transactiontime, INTERVAL pa.months MONTH))
ORDER BY
    tr.transactiontime ASC