我有一个包含数百万行的表,我需要做很多类似的查询:
select max(date_field)
where varchar_field1 = 'something'
group by varchar_field2;
我的问题是:
答案 0 :(得分:15)
(varchar_field1, varchar_field2, date_field)
上的索引最常用。数据库可以使用where
子句的第一个索引字段,group by
的第二个索引字段,以及计算最大日期的第三个索引字段。它可以仅使用该索引完成整个查询,而无需查找表中的行。
答案 1 :(得分:0)
显然,varchar_field1上的索引会有很多帮助。
答案 2 :(得分:-1)
您可以使用列
创建一个额外的表 varchar_field1 (unique index)
max_date_field
您可以在要搜索的表上设置插入,更新和删除触发器以维护此小表 - 无论何时添加或更改行,都要在此表中设置一行。
使用这种重构技术,我们在性能改进方面取得了很大成功。在我们的例子中,它变得更简单,因为我们永远不会删除表中的行,直到它们太旧以至于没有人查找最大字段。如果您可以将max_date_field
添加到其他表而不是创建新表,这是一种特别有用的技术。