我有一张鸽子数据表。
pigeon_id =鸽子的ID
date_time = signal_event的时间
pigeon_station =鸽子站的id
signal_strength =鸽子的信号强度
CREATE TABLE `pigeon_signal` (
`pigeon_id` varchar(20) NOT NULL,
`date_time` int(11) DEFAULT NULL,
`signal_strength` decimal(10,0) NOT NULL,
`pigeon_station` varchar(20) DEFAULT NULL,
KEY `index1` (`pigeon_id`,`pigeon_station`),
KEY `index2` (`pigeon_id`,`date_time`,`pigeon_station`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;表数:500 000行
每只鸽子都有一个发射器。每隔几秒钟,鸽子站就会记录周围鸽子的信号强度。
我想问一下鸽子站第一次看到鸽子的时候。这是我的sql。它很慢,但是它返回正确的结果:
select ps2.* from pigeon_signal as ps join
(select MIN(date_time) as date_time, pigeon_id, pigeon_station from pigeon_signal group by pigeon_id, pigeon_station) ps2
on ps.date_time = ps2.date_time and ps.pigeon_id = ps2.pigeon_id and
ps.pigeon_station = ps2.pigeon_station解释扩展:

查询大约需要2秒才能运行(太长)。
有更好的方法来查询这些数据吗?
我希望有任何与这个问题有关的建议/提示/建议。
非常感谢:D
更新:
谢谢你的回答!
我已经将pigeon_id列更改为varchar(20)。
@ypercubeᵀᴹI将索引更改为您建议的索引,这是最快的(谢谢!!)但是为什么呢?
distinct pigeon_id: 25306
distinct pigeon_station: 36
distinct date_time: 452322
我的想法是:将索引属性按上升的不同元素的数量排序。结果:
为什么选项2比选项1快?因为pigeon_station值不像pigeon_id那样清晰。
但是,如果最优索引应该根据不同值下降的数量对属性排序,那么为什么选项4不是最快的呢?
非常感谢你抽出时间
发布于 2017-11-01 02:34:40
想必一只鸽子不可能在一秒内到达车站两次?然后添加以下内容:
PRIMARY KEY(pigeon_id, pigeon_station, date_time)这将改进ypercube的建议,也许会提高2倍。
在这一点上,您的两个索引都可能变得无用。但在此之前,让我们看看其他重要的查询。
https://dba.stackexchange.com/questions/189658
复制相似问题