我有一个带有日期列的表格,其中日期被保存为长值,我想按月分组记录(但不是格里高利月!)并将其他列值相加。
我首先创建了一个带有两个日期列的临时表(_from和_to),其中__是一个月的第一毫秒,而_to是该月的最后一毫米。
然后我做了这样的选择:
SELECT SUM(MY_TABLE.amount), TEMP_TABLE._from
FROM MY_TABLE, TEMP_TABLE
WHERE TEMP_TABLE._from <= MY_TABLE.date AND TEMP_TABLE._to >= MY_TABLE.date
GROUP BY TEMP_TABLE._from;
MY_TABLE: 金额:我希望对每个月的值进行求和的列。 日期:每条记录的日期。
但是对于10K记录,返回结果表大约需要2秒钟,而且在我的用例中它太慢了。我需要一个更好的解决方案。
答案 0 :(得分:1)
如果_from
列没有索引,数据库必须将所有_from
值写入临时表,以便能够对它们进行分组。
如果date
列没有索引,则无法在不扫描整个表的情况下查找值。
您应该至少拥有以下indexes:
CREATE INDEX Temp_Table_from ON Temp_Table(_from);
CREATE INDEX My_Table_date ON My_Table(date);
对于此特定查询,您可以使用covering indexes来提高性能:
CREATE INDEX Temp_Table_from_to ON Temp_Table(_from, _to);
CREATE INDEX My_Table_date_amount ON My_Table(date, amount);
使用EXPLAIN QUERY PLAN检查查询实际使用的索引。