以下是使用InnoDB的2个表:
devices
{
sid - primary key bigint autoincrement unique,
imei - char (15)
}
表:
positions
{
pid - primary key bigint autoincrement unique,
sid - foreign key referencing devices,
timeUtc - datetime,
lat - float,
lon - float
}
在服务器上,我有500台设备每10秒钟发送一次GPS坐标(大部分时间每30分钟一次)。 所有坐标都存储在表格位置。 表位有20个Mio记录。 每30分钟删除3个月以上的位置,因此不会持续增长,并保持大约20 Mio记录。
快速运行的目标查询是:
SELECT lat,lon FROM positions
WHERE sid=SOME_DEV_ID
WHERE timeUtc >= SOME_DATETIME
AND timeUtc < ANOTHER_DATE_TIME
ORDER BY timeUtc ASC
我创建了索引:INDEX time_sid (timeUtc, sid) asc
我的查询仍然很慢[24小时内为ANOTHER_DATE_TIME-SOME_DATETIME
30秒,其结果是单个设备的2000-5000结果行],而使用索引和内存池大小为1 GB。
MySQL管理员统计信息显示:数据大小为0.9 GB,索引大小为1.7 GB。
发动机状态显示,指数命中率为1000的999。
当仅使用timeUtc
而不涉及sid
时,它会返回很多行,但速度非常快[0.2秒]。但是当涉及sid
时,它变得非常缓慢。我在查询中也更改了timeUtc
和sid的顺序,没有任何更改。
我应该仅使用timeUtc
列的索引和sid还是我应该保留索引?
内存池增加会带来更好的结果吗?我问,因为订购更多内存会导致我的虚拟服务器上每个月的成本显着增加,所以回答“只是尝试”并不容易。
有什么错误,在20 mio记录数据库中我的结果如此糟糕?