【发布时间】:2017-12-10 09:35:14
【问题描述】:
我有一个包含数百万行的巨大表,其中存储从某些气象站获得的值。每行都包含收集值的站点、指标(例如温度、湿度、噪音水平等)、日期和值本身。
这是它的结构:
-
station: int(8) -
metric: int(8) -
date: 日期时间 -
value: 浮动
这些是我定义的索引:
- 主键:
station+metric+date - KEY:
metrica(外键)
有时,我有兴趣检索每个站点上一次发送某些值的时间。然后我使用这个查询:
SELECT station, MAX(date)
FROM MyTable
GROUP BY station
这个查询很慢,因为它必须读取整个表。如果我为站+日期添加索引,现在查询可以使用它并且变得非常快。但是表存储也增加了很多,对我来说索引所有日期值没有用,因为我只对最大值感兴趣。
所以我的问题是是否可以创建一个索引某个范围的索引,理想情况下只跟踪最大值。
【问题讨论】:
-
您最好将该信息存储在另一个表中——比如
Stations表——并在每次插入一行时使用触发器更新信息。 -
可以把PK改成
station+date+metric吗?从功能上讲,它是一样的,但实际上它(几乎)与添加额外索引的情况一样快。 -
@deroby 我试过了,确实查询会立即运行。但是另一个频繁查询,例如“列出一个站点的一周温度值”现在执行速度较慢(不是那么多,慢了大约 25%)。鉴于最后一个在我的应用程序中更为频繁,我将保留我以前的主键。谢谢!
标签: mysql indexing max query-optimization