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