我有下面的查询,通过分析会花费更多的时间预期,我想调整一些。查询的目的是从给定device_id的Messages表中获取最后3个小时的数据,并按上次消息接收(time 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
答案 0 :(得分:3)
您尚未发布解释计划,但看起来您要执行全表扫描或索引范围向下扫描DEVICE_ID
,然后通过rowid单独访问每一行,因为您的整个选择不是在索引中,DEVICE_ID
不是唯一的。
索引创建没有硬性规则,但通常你应该按照基数(列中有多少个不同的值)的顺序索引WHERE子句中的值。当您选择一系列日期时,我建议您在DEVICE_ID
,CREATION_DATE
上创建一个索引。
您还在使用select *
。如果您不需要选择每列,don't do this。从磁盘读取的字节数更多,必须通过网络发送更多字节等。如果您只选择DEVICE_ID
,CREATION_DATE
和TIME
我会建议索引按此顺序更改为这三列,因此您根本不会触及该表,只需从索引中进行选择和排序。
如果业务逻辑声明此列列表应该是唯一的,那么创建一个唯一索引而不是普通索引。最后,如果你不绝对需要ORDER BY然后删除它。然后删除需要额外时间的排序。