Оптимизация Mysql Join Query - PullRequest
0 голосов
/ 06 мая 2011

У меня есть две таблицы в MySQL:

Results Table : 1046928 rows.
Nodes Table :  50 rows.

Я объединяю эти две таблицы с помощью следующего запроса, и выполнение запроса выполняется очень и очень медленно.

select res.TIndex, res.PNumber, res.Sender, res.Receiver, 
sta.Nickname, rta.Nickname from ((Results res join 
Nodes sta) join Nodes rta) where ((res.sender_h=sta.name) and
(res.receiver_h=rta.name));

Пожалуйста, помогите мне оптимизировать этот запрос. Прямо сейчас, если я хочу вытащить только верхние 5 рядов, это займет около 5-6 минут. Спасибо.

CREATE TABLE `nodes1` (
  `NodeID` int(11) NOT NULL,
  `Name` varchar(254) NOT NULL,
  `Nickname` varchar(254) NOT NULL,
  PRIMARY KEY (`NodeID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `Results1` (
  `TIndex` int(11) NOT NULL,
  `PNumber` int(11) NOT NULL,
  `Sender` varchar(254) NOT NULL,
  `Receiver` varchar(254) NOT NULL,
  `PTime` datetime NOT NULL,
  PRIMARY KEY (`TIndex`,`PNumber`),
  KEY `PERIOD_TIME_IDX` (`PTime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Ответы [ 2 ]

4 голосов
/ 06 мая 2011
SELECT  res.TIndex ,
        res.PNumber ,
        res.Sender ,
        res.Receiver ,
        sta.Nickname ,
        rta.Nickname
FROM    Results AS res
        INNER JOIN Nodes AS sta ON res.sender_h = sta.name
        INNER JOIN Nodes AS rta ON res.receiver_h = rta.NAME
  1. Создать индекс по результатам (sender_h)
  2. Создание индекса по результатам (получатель_h)
  3. Создать индекс на узлах (имя)
1 голос
/ 06 мая 2011

Присоединение к узлу name, а не NodeId (первичный ключ), выглядит не очень хорошо.

Возможно, вам следует хранить NodeId для внешнего ключа sender и receiver в таблице Results вместо name Добавление ограничений внешнего ключа также является хорошей идеей. Помимо прочего, это может вызвать автоматическое индексирование в зависимости от вашей конфигурации

Если это изменение сложно, по крайней мере, вы должны применить уникальность в поле node name

Если вы измените определение таблиц таким образом, измените запрос на рекомендацию Джона и добавьте индексы, он должен работать намного лучше и быть намного более читабельным / лучшим в форме.

...