2015-01-20 21 views
3

我有一个Raspberry Pi我一直用来记录从一堆1-Wire传感器收集的家庭温度数据。这些数据已经在数年内收集到MySQL数据库中。我使用Raspbian发行版和默认的MySQL配置。我现在有一张拥有超过一百万条记录的表格,我的Pi正在非常缓慢地运行查询。如何在低规格系统上的lrge表上提高MySQL性能?

这里是TemperatureRecords表的描述:

+--------------+----------+------+-----+---------------------+-------+ 
| Field  | Type  | Null | Key | Default    | Extra | 
+--------------+----------+------+-----+---------------------+-------+ 
| timeRecorded | datetime | NO | PRI | 0000-00-00 00:00:00 |  | 
| sensorName | char(3) | NO | PRI |      |  | 
| tempValue | float | YES |  | NULL    |  | 
+--------------+----------+------+-----+---------------------+-------+ 

我记录为温度的日期和时间,一个3字符传感器名称和值。 我想运行两个查询,一个选择某个传感器的当前(最近)温度,一个选择当天最高温度。

当前温度例如:

SELECT ROUND(tempValue, 1) as tempValue 
FROM TemperatureRecords 
WHERE DATE(timeRecorded) = '2015-01-20' AND HOUR(timeRecorded) = '20' AND sensorName = 'abc' 
ORDER BY timeRecorded DESC LIMIT 1; 

最高温度例如:

SELECT MAX(tempValue) 
FROM TemperatureRecords 
WHERE DATE(timeRecorded) = '2015-01-20' AND sensorName = 'abc'; 

不幸的是,这些可能需要10-20秒才能完成,这太慢了,尤其是当我想要从数据几个传感器一次显示在网页上。

我试图增加额外的索引表,但是这并没有作出任何改善,我不知道我的理解完全索引反正。我使用MySQL配置在/usr/share/doc/mysql-server-5.5/examples/my-small.cnf发现小系统,我被告知可能会提高性能,但无济于事也试过。

我的MySQL的知识是有点基本。我对Raspberry Pi的期望很高,现在我的数据变得如此之大,或者我能做些什么来改进我的设置?

+0

是的。尝试使用RANGE查询 – Strawberry 2015-01-20 22:52:18

回答

1

DATE()调用方法将让你陷入困境,立即。这些不能索引,没有索引,你死在水中。

如果经常调用这些,创建一个DATE列正好包含您要搜索的数据。您可能还需要一个列来捕获您正在提取的小时信息。

数据库规范化的原则也适用,直到你进入这样的情况下的理想形式是慢得不可接受。在这种情况下,您需要小心地解除规范以解决这些问题。保持同步这样的数据可能会非常棘手,因此,每当对主日期进行更改时,请务必保持所有这些派生列处于最新状态。

你可能有机会在这里使用DATETIME原样,如果你能缩小它的时间范围,如:

WHERE timeRecorded BETWEEN '2015-01-20 20:00:00' AND '2015-01-20 20:59:99' 

如果这样的作品,现有索引也适用。

3

罪魁祸首是WHERE DATE(timeRecorded) = '2015-01-20' - 它计算所有行的DATE()(不管它们是否匹配)并且禁止使用索引。

尝试:WHERE timeRecorded >= '2015-01-20 00:00:00' and timeRecorded < '2015-01-21 00:00:00'

this SO question索取详细资料!

+0

@Strawberry良好的抓住,谢谢! – 2015-01-20 23:25:08

1

我认为你可以在Raspberry Pi上实现,你只需要改变你的重处理查询的处理方式。

如果它的历史数据,每天处理数据并将其保存到另一个(更小,更快)的表格中,并可以通过网页快速引用。

每小时平均也只运行一次,保存到单独的表中。

将当前温度放置在缓冲区表和记录中,但只有网页访问缓冲区表。

它可能不是那么准确,但希望其差异很小,但你应该看到一个大的速度增加