-1

我有以下查询,通过分析需要更多的时间,我想对其进行一些调整。查询的目的是从 Messages 表中获取给定 device_id 的最后 3 小时数据,并按最后接收的消息(时间 desc)对结果进行排序。目前数据库上的复合索引似乎并不理想。是否有任何索引或查询语法更改建议以加快此查询?

消息表结构:

列:

id (auto incremented PK NUMBER(10))
device_id
model_id 
state
creation_date (DATE when row was inserted)
time (unix time message was transmitted)
//a bunch of other columns omitted

索引:

id
device_id, model_id, state (composite index)

询问:

select * from messages where device_id='0-12345678' and creation_date > sysdate-3/24 order by time desc
4

1 回答 1

3

您尚未发布说明计划,但看起来您将进行全表扫描或向下索引范围扫描DEVICE_ID,然后通过 rowid 单独访问每一行,因为您的整个选择不在索引中并且DEVICE_ID不是唯一的。

索引创建没有硬性规定,但通常您应该按照基数(列中有多少不同的值)的顺序索引 WHERE 子句中的值。当您选择一系列日期时,我建议您在DEVICE_ID,上创建一个索引CREATION_DATE

你也在使用select *. 如果您不需要选择每一列,请不要这样做。从磁盘读取更多字节,必须通过网络发送更多字节等。如果您只选择 , ,DEVICE_ID我建议按此顺序将索引更改为这三列,那么您根本不要触摸表格,您可以仅从索引中进行选择和排序。CREATION_DATETIME

如果业务逻辑声明此列列表应该是唯一的,则创建一个唯一索引而不是普通索引。最后,如果您不是绝对需要 ORDER BY,则将其删除。然后,您删除需要额外时间的排序。

于 2013-05-16T17:56:33.803 回答