【发布时间】:2017-10-02 08:18:18
【问题描述】:
我选择表中记录子集的最后一条记录(通过时间戳字段),并希望创建一个有用的索引来加快查询速度。令我惊讶的是,我无法定义 Firebird 愿意使用的索引。我也没有在互联网上找到任何关于我的问题的示例或提示。所以,也许我可以在这里找到一些帮助。
我有一张这样的桌子
create table MDE_ST (
ID integer not null,
RESOURCE_ID integer not null,
STARTTIME timestamp not null,
...
primary key (ID),
foreign key (RESOURCE_ID) references RESOURCES
);
还有这样的查询
select *
from MDE_ST
where RESOURCE_ID = ?
order by STARTTIME desc
rows 1
我的问题是,查询真的很慢。 Firebird 总是使用资源的外键索引来执行查询。但是只有几十个资源,但每个资源有上万条记录。所以 Firebird 会在资源记录中进行自然扫描。
我试试索引
create index MDE_ST_ASC on MDE_ST (RESOURCE_ID, STARTTIME);
和
create desc index MDE_ST_DESC on MDE_ST (RESOURCE_ID, STARTTIME);
但没有任何改变。 Firebird 总是使用外键的索引。在您问之前:索引统计信息是最新的。
我的问题:我必须创建什么索引来加快查询速度?
【问题讨论】:
-
将您的查询更改为不使用
SELECT *,优化器很可能会忽略您拥有的任何索引,因为它会按照它想要的方式读取所有内容。 -
@dbajtr:在真正的查询中没有
select *。这里只是为了简化问题。 -
要知道您需要什么索引来显示查询。如果您在
Resource_ID上搜索但想要所有内容,那么只在该列上有一个索引是有意义的,如果不查看查询就不确定Von键的用途 -
哦,对不起。在将代码翻译成英文时,我忘记了索引定义中的字段名称。编辑了我的问题。
-
再一次,没有查看我假设的完整查询。我不认为
STARTTIME是必要的。因为您在Resource_id上搜索并获得更多列,它将使用 FK 搜索 ID,然后使用key lookup从表中获取其他列。如果您只想要这两列,但如果您想要更多,那将是有意义的