在Postgres中可以执行这样的订单
SELECT * FROM mytable
WHERE id in (8, 6, 7, 5, 10, 24)
ORDER BY id=8 DESC, id=6 DESC, id=7 DESC, id=5 DESC, id=10 DESC, id=24 DESC;
以任意顺序选择任意数据。
我认为如果某些排序算法有O(log n),我们天真地做一个像这样的索引:
data.sort(function(a, b) {
return indexOf(a) < indexOf(b);
});
然后我们每个排序操作可能需要O(2n),使我们的总算法时间为O(n log n)。
然后,我们可以为位置创建一个简单的值索引,而不是每次都使用。假设这也是O(log n)的最差时间,那么对于我们的排序算法,我们得到O((log n)(log n))或O((log n)^ 2)。这对于算法而言并不是很好的表现。
什么算法,Postgres使用什么性能?如果它优于O((log n)* the_sort_algorithms_performance),我们将在db之外实现排序。或者,如果算法是一个我们很容易移植到Java的算法,我们可能仍然不会在Postgres中进行排序。
答案 0 :(得分:2)
TLDR;没有详细讨论你的广泛问题。排序算法是一个复杂的领域。
至于你的查询:如果你提供一个值列表,这可能会相当便宜,因为你必须以某个顺序传递值:
SELECT t.*
FROM unnest('{8, 6, 7, 5, 10, 24}'::int[]) id
JOIN mytable t USING (id);
这有效,但没有保证。可以肯定(在Postgres 9.4 +中):
SELECT *
FROM unnest('{8, 6, 7, 5, 10, 24}'::int[]) WITH ORDINALITY x(id, rn)
JOIN mytable t USING (id)
ORDER BY x.rn;
详细说明: