我的数据库中有两个表格大致如下:
沟通:(致电)
Timestamp FromIDNumber ToIDNumber GeneralLocation
2012-03-02 09:02:30 878 674 Grasslands
2012-03-02 11:30:01 456 213 Tundra
2012-03-02 07:02:12 789 654 Mountains
运动:
Timestamp IDNumber Type X Y
2012-03-02 11:02:30 379 pedestrian 32 46
2012-03-01 12:32:41 654 pedestrian 54 56
2012-03-02 07:02:16 789 pedestrian 39 52
我想运行此查询:
SELECT c.senderID, c.timestamp, m.timestamp, m.x, m.y
FROM communication c
JOIN movement m
ON c.senderID = m.visitorID
WHERE m.timestamp >= c.timestamp
ORDER BY m.timestamp LIMIT 1;
基本上,我想找到给定通信时间戳的最接近的移动时间戳。
问题是,这些表有数百万个条目,我需要使用索引。问题是,我是SQL的新手,而且我不确定如何构建我的索引......我是否需要像这样分别为m.timestamp和c.timestamp设置一个?
CREATE INDEX mtstamp ON DBName.movement (timestamp);
CREATE INDEX ctstamp ON DBName.communication (timestamp);
任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
我认为您需要一个复合索引,其中包含您在JOIN
中使用的ID和时间戳。否则,它只会使用ID索引进行连接,但是必须扫描所有匹配的行才能进行时间戳比较。
CREATE INDEX sender_timestamp ON communication (senderID, timestamp);
CREATE INDEX visitor_timestamp ON movement (visitorID, timestamp);
答案 1 :(得分:1)
我会在两个表上的timestamp
上创建索引,因为该列在WHERE
条件中用于过滤行以及ORDER BY
中的排序。
此外,在senderID
表中的Communication
和visitorID
表中的Movement
创建索引,除非这些是相应表中的主键列;因为这两列涉及连接条件。