MySQL复合或包含外键的单独索引

时间:2014-11-24 08:42:39

标签: mysql indexing key innodb

以下是使用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记录数据库中我的结果如此糟糕?

0 个答案:

没有答案