如果我有这样的查询:
SELECT name FROM
(
SELECT * FROM `table`
WHERE id IN (1,40,300)
ORDER BY AnotherColumn
)
从带宽和开销的角度来看,这与执行三个单独的查询是一回事吗?还是开销明显减少了?
如果我有这样的查询:
SELECT name FROM
(
SELECT * FROM `table`
WHERE id IN (1,40,300)
ORDER BY AnotherColumn
)
从带宽和开销的角度来看,这与执行三个单独的查询是一回事吗?还是开销明显减少了?
您想要的数据量可能很快就可以通过线路发送,但是 mysql 正在做什么来处理它并为传输做准备???
我们先看看原始查询
如果 id 是主键,这应该很快。然而,您不需要说获取子查询中的所有列,然后从该子查询中读取名称。您可以将 SQL 编写为
甚至更好,根本没有子查询
您可以对其中的每一个进行基准测试,发现名义上的差异可以忽略不计,但实际上没有什么可以发布白皮书。如果执行了数千个这样的查询,查询摘要程序(例如pt-query-digest或mk-query-digest)可以轻松地选出获胜者,以确定谁在每次调用的运行时间方面最快。
关于您的原始问题,请从以下方面考虑:
如果看一场电影每人 8 美元,而你必须带三个人去看一场电影,哪个更便宜?
好吧,算一下。
显然,CASE02 中的开销增加了 50%。
如果拼图涉及
随着 N 趋于无穷大,平均开销增加了一倍。
在一个子查询中调用三个查询或在一个子查询中获取三行数据肯定比三个单独的查询要好。
似乎 MySQL 允许在无关紧要的子选择中使用 ORDER BY,就像在这种情况下一样。外部 SELECT 没有 ORDER BY,因此不能保证查询结果是有序的。
Jakobud,您希望模拟哪三个 SELECT 语句?我只看到一个:
实际上,您希望优化器意识到运行查询只需要 name 和 AnotherColumn,但我认为这才是真正的问题:当显示此语句时,MySQL 优化器会做什么?这将取决于 Table01 使用哪个存储引擎,以及它上面有哪些索引可用。理想情况下,此查询在 (id, AnotherColumn, Name) 上有一个索引,以便查询自然地从索引中得到满足,并且不需要返回到表中查找其他列或执行排序操作来满足 ORDER BY - - 假设 ORDER BY 被兑现。