创建SQL索引?

时间:2015-05-29 22:07:10

标签: mysql sql indexing phpmyadmin

我的数据库中有两个表格大致如下:

沟通:(致电)

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); 

任何帮助将不胜感激,谢谢!

2 个答案:

答案 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表中的CommunicationvisitorID表中的Movement创建索引,除非这些是相应表中的主键列;因为这两列涉及连接条件。