希望你们一切顺利,做得好!
我有一张表items
,其中有200万条记录,结构如下所示:
id (int) | price (decimal) | priority (int)
-------------------------------------------
10001 | 59000.25 | 1
10002 | 73000.91 | 2
10003 | 1000.23 | 1
10004 | 9567.18 | 1
我正在寻找的解决方案非常简单:如何在ASC | DESC订单上price+priority
对此表进行排序?
当前和有效的解决方案:我正在使用ORDER BY priority ASC, price ASC
。但据我所知,对多列进行排序是缓慢的而不是优化的方法(因此我面临实时的缓慢)。
我尝试的解决方案:我在此表中添加了一个临时列:
id (int) | price (decimal) | priority (int) | new_priority (varchar)
--------------------------------------------------------------------
10001 | 59000.25 | 1 | a59000.25
10002 | 73000.91 | 2 | b73000.91
10003 | 1000.23 | 1 | a1000.23
10004 | 9567.18 | 1 | a9567.18
我已将1 => a, 2 => b, 3 => c
替换为10(我在数据库中的最大数量)
现在,每当我在SQL下面尝试时,它们都没有工作
SELECT * FROM items
ORDER BY new_priority ASC
SELECT * FROM items
ORDER BY new_priority::bytea
SELECT * FROM items
ORDER BY SUBSTRING(new_priority FROM '^(.*?)( \\d+)?$'),
COALESCE(SUBSTRING(new_priority FROM ' (\\d+)$')::INTEGER, 0)
请指教!
我提到的链接:
答案 0 :(得分:2)
如何创建index?索引是一种增强数据库性能的机制。创建索引可能很慢并且可能持续几个小时,但您会注意到进一步查询的差异。
答案 1 :(得分:0)
您可以使用NEW_PRIORITY
作为DECIMAL
来做更好的解决方案。
假设PRICE
中的值不大于(比方说)999999且PRIORITY
不太“大”,则可以使用PRIORITY*1000000+PRICE
。
无论如何,我认为在评论中使用索引可能是更好的解决方案。
要创建“复合索引”,您可以使用以下sintax:
CREATE INDEX index_name ON table_name (priority ASC, price ASC);
答案 2 :(得分:0)
数据多久更改一次?如果不经常,请使用function getTotalCost(item, callback) {
$.ajax({
dataType: "json",
url: "/retrieveData.do?item=" + item.email,
success: function(data) {
var totalCost = 0;
for (var i = 0; i < data.length; i++) {
totalCost += parseFloat(data[i].cost);
}
callback(totalCost);
}
});
}
。
请参阅:https://www.postgresql.org/docs/9.5/static/sql-cluster.html
它基本上会按索引的顺序对表进行排序。
将此群集与etsa的答案结合起来。
问题是,CLUSTER没有维持秩序。 因此,如果您插入了新行,它将被插入到最后一行。