我选择表中记录子集的最后一条记录(通过时间戳字段),并希望创建一个有用的索引来加速查询。令我惊讶的是,我无法定义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始终使用外键的索引。在您提出之前:索引统计数据是最新的。
我的问题:我必须创建哪个索引才能加快查询速度?
答案 0 :(得分:1)
试
create desc index MDE_ST_DESC on MDE_ST (STARTTIME);
答案 1 :(得分:0)
Firebird中的所有索引都是单向的。索引可能是 从最低值到最高值(升序)或 从最高值到最低值(降序)。关键字 ASC [ENDING]和DESC [ENDING]用于指定方向 指数。默认索引顺序为ASC [ENDING]。它非常有效 在同一列上定义升序索引和降序索引 键集。
降序索引对于要经历的列非常有用 搜索高值(“最新”,“最大”等)
使用" ORDER BY" DESCENDING 您应该为此列使用降序索引。
换句话说,索引的方向应该与"的顺序相同,顺序为" 。