Mysql 在没有任何()的情况下,哪一个是最便宜的聚合函数
如果DBMS没有ANY()聚合函数,我通常使用MAX()或MIN() mySQL和MS-SQL中是否有更便宜的东西?最小值和最大值同样昂贵。中没有任何聚合 这里有一个任意限定符来匹配部分和全部Mysql 在没有任何()的情况下,哪一个是最便宜的聚合函数,mysql,sql,tsql,Mysql,Sql,Tsql,如果DBMS没有ANY()聚合函数,我通常使用MAX()或MIN() mySQL和MS-SQL中是否有更便宜的东西?最小值和最大值同样昂贵。中没有任何聚合 这里有一个任意限定符来匹配部分和全部 (如此) (SQL Server Pedia) 最小值和最大值是合适的集合。。。完全不相关,不应进行比较 编辑: 只有MySQL具有这种“任意”聚合的模糊性:SQLServer、Sybase、Oracle和PostGres没有。请参见MySQL不需要任何()聚合 如果我做一个 SELECT field
- (如此)
- (SQL Server Pedia)
只有MySQL具有这种“任意”聚合的模糊性:SQLServer、Sybase、Oracle和PostGres没有。请参见MySQL不需要任何()聚合 如果我做一个
SELECT field1, field2, SUM(field3) FROM table1
GROUP BY field2
微软的T-SQL会抱怨,但
MySQL将静默执行
SELECT whatever(field1), field2, SUM(....
当然,这比选择最大值(字段1)、字段2、总和(按字段2分组)快得多
MySQL支持ANY
,但选择ANY(field1).
不起作用,因为ANY
是一个类似于中的和ALL
的操作符
见:
我喜欢MySQL好吧,让我们重新表述一下原来的问题。如果提供EXISTS聚合函数,那就太好了,而不是任何一个模棱两可且不是SQL标准的问题
我曾多次使用“count(outer.column)>0”来模拟“exists(outer.column)”,这可能会更便宜,因为不管怎样计数都会被丢弃。从MySQL 5.7(2015年10月发布)开始,实际上有一个函数可以实现这一点!任何值(col)
都明确满足这一需求-有关详细信息,请参阅
但是,需要注意的是,它似乎仍然不能保证短路,并且可能仍然执行完全扫描,因此可能无法实现更高效率的目标。如果MySQL对此很聪明,那么还是有机会的,尽管测试是明智的。在两种情况下,它可能会有所帮助:
- 如果要聚合的值特别大并且没有索引,那么任何比较都会很昂贵
- 如果通过利用
max
或其他占位符聚合,代码中的意图会变得不那么清晰。例如,max
可能意味着它存在的原因,而不是得到“任何东西”从分组中,但是任何_值都将明确定义意图,而无需附加注释
玩具样本:
select
col,
any_value(a.val) as any_val
from (
select 'blue' as col, 3 as val
union all
select 'blue' as col, 2 as val
union all
select 'green' as col, 1 as val
) as a
group by col
为什么不存在ANY()聚合函数?为什么会存在ANY()聚合函数?它的规范是什么?您对ANY()
的意思是什么?它应该返回一个随机行?ANY(expresion)
:返回组内的任何表达式值。为了在所有列都相同或任何列都是好的情况下对琐碎的依赖列具有良好的性能,我知道ANSI-92 SQL中没有任何聚合,但还有其他更便宜的吗?@Luis-如果字段已索引,则在索引的fie上没有。MIN
和MAX
ld只需转到索引中的第一个或最后一个条目。@JNK:但MIN()或MAX()不可以?@Parkyprg:No,MIN
和MAX
将使用索引(如果有)@JNK-只有当你得到一个MAX
而不是使用groupby
时,这才是正确的。如果你做groupby
即使groupu\u列上有索引,聚合的\u列也不会跳到下一个组。模棱两可且不明确=危险。@gbn,许多工具都给你一把枪,这就是这就是为什么你需要了解你的工具,这样你就不会开枪打自己的脚。枪杀人还是人杀人完全是另一个讨论。糟糕的类比:不可比。在这种情况下,我认为没有必要让RDBMS代表我猜测一个专栏。只有MySQL也有这种模糊性:SQL Server、Sybase、Oracle、PostGres没有。看到了吗这不是一个奇妙的造币术,而且非常恰当:白痴,就像在白痴[tic][ideo]ology中一样,就像在“MySQL的白痴”中一样。我会记住那一个。(正确的拼写是ideology,顺便说一句。)@Johan-把你的枪支类比带到它的结论中-质量枪支(所有其他RDBMS)给你一个安全开关,以防止意外射击。MYSQL给你一个一触即发的触发器和过载的弹药,使你更容易伤害自己。我为“我的聚合”函数选择了一个错误的名称。但我指的是一种让max()或min()更便宜的替代方法如果它存在great!!@gbn-我不知道重写查询是否会有任何好处。可能会稍微减少CPU时间,因为它不需要进行任何比较?@Martin Smith:我认为这是一种内部优化,可以处理上述情况。如果直接使用,它会造成类似于M的混乱无意义群