2015-05-29 2 views
1

У меня есть две таблицы в моей базе данных, которые выглядят примерно так:Создание индексов SQL?

связи: (звонки из)

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; 

В принципе, я хочу найти ближайшее движение ti mestamp для заданной временной метки связи.

Дело в том, что эти таблицы имеют миллионы записей, и мне нужно использовать индексы. Проблема в том, что я новичок в SQL, и я точно не знаю, как структурировать мои индексы .... мне нужно было бы один для m.timestamp и c.timestamp отдельно, как это?

CREATE INDEX mtstamp ON DBName.movement (timestamp); 

CREATE INDEX ctstamp ON DBName.communication (timestamp); 

Любая помощь будет принята с благодарностью, спасибо!

ответ

2

Я думаю, вам нужен составной индекс, который включает в себя как идентификатор, который вы используете в JOIN, так и временную метку. В противном случае он просто будет использовать индексы ID для соединения, но затем ему придется сканировать все соответствующие строки, чтобы выполнить сопоставления с меткой времени.

CREATE INDEX sender_timestamp ON communication (senderID, timestamp); 
CREATE INDEX visitor_timestamp ON movement (visitorID, timestamp); 
+0

Ох ... Так что я в основном создавать индексы для 'm.timestamp',' 'c.timestamp', c.senderID',' m.visitorID', и композит, что вы писали? Вы просто используете составные индексы, когда используете оператор, которому нужны столбцы из двух таблиц? – ocean800

+1

Вам не нужны индексы на 'senderID' и' visitorID', потому что префикс составного индекса также может использоваться как индекс сам по себе. – Barmar

+0

Я так большое спасибо! Итак, я только что редактировал свой вопрос, мои индексы должны быть структурированы так, правильно? – ocean800

1

Я бы создал индекс на timestamp на обоих таблицах, так как этот столбец используется в WHERE состоянии для фильтрации строк, а также в ORDER BY для сортировки.

Кроме того, создать индекс по senderID в Communication таблице и visitorID в Movement таблице, если те не являются столбец первичного ключа на соответствующей таблицы; так как эти два столбца участвуют в состоянии соединения.

Смежные вопросы