向ORDER BY添加更多列是否会降低性能?
ORDER BY STYLE
VS
ORDER BY STYLE, SIZE, COLOR
答案 0 :(得分:3)
一般来说,是的。想象一下,桌子上有数千种相同的风格,每种风格都有许多不同颜色的相同尺寸。然后SQL引擎必须首先对样式执行排序,然后对于每种样式,它必须对大小和最终颜色进行排序。比单独排序样式更耗时。但实际的惩罚可能会有所不同,具体取决于表结构,使用的索引,SQL服务器的味道等。您的里程可能会有所不同。
答案 1 :(得分:2)
如果列上没有任何索引:否。
ORDER BY子句在执行时永远不会变成一系列SORT操作。排序列表时,查询引擎将在结果集中的行之间进行一次或多次比较;它使用ORDER BY子句来确定一行应该在另一行之前还是之后。它只需要做一次。
ORDER BY子句中表达式的复杂性当然可能会对性能产生影响(例如,如果其中一个涉及调用执行某些昂贵操作的函数),但性能损失与排序列本身的数量没有直接关系。
答案 2 :(得分:1)
如果您在(style, size, color)
,和上有一个复合索引,则根据索引中不存在的列没有WHERE
子句,您可以{{ 1}}免费订购。
如果您只有一个复合索引color
,那么将(style, size)
列添加到color
将需要数据库进行一些重新排序,这会慢一些。
如果您之前没有用于ORDER-BY优化的索引,则数据库无论如何都必须重新排序,因此您不会因为在订单中添加列而损失太多。
关于ORDER-BY优化的Some background。这里的细节是特定于MySQL的,但一般的概念在关系数据库中的索引很常见。
答案 3 :(得分:0)
是的,但我不认为这是重要的,因为你已经有了order by子句。
答案 4 :(得分:0)
可能有,这取决于您选择的数据以及您按哪种数据排序。
通常根本没有可测量的性能差异。我刚刚比较了两个相同的查询的执行计划,除了一个字段在一个字段上排序,而另一个在95个字段上排序,并且在CPU成本或排序操作的I / O成本方面没有任何差别
如果我减少了所选字段的数量,以便排序必须访问原本不需要的数据,则CPU成本差异为1.6%。这是一个区别,但肯定不重要。
答案 5 :(得分:0)
如果你的索引涵盖了将要使用的排序,那么我想如果有的话,它不会改变那么多。 即如果你有一个具有STYLE,SIZE,COLOR的indedx 如果您有3个单独的索引STYLE,SIZE,COLOR或没有索引,那么perf会更糟,因为它可能只能使用一个索引来进行排序。 有时虽然SQL服务器可能不会使用查询计划的索引,即使存在一个好的索引,取决于您的查询的其余部分正在做什么......
你如何找出性能惩罚.. 在SQL Management Studio中编写查询并打开执行计划,在左侧查找节点的子树成本,作为在机器成本和性能方面哪个查询最佳的指示。 结果可能会根据数据而改变(如果您的测试服务器包含少量数据,您可能会得到与大型生产数据非常不同的查询计划)