SQL-запрос медленный - PullRequest
       11

SQL-запрос медленный

1 голос
/ 18 ноября 2011

У меня есть база данных phpmyadmin с 1 000 000 записей, в которых мне нужно искать. Каждую неделю добавляется 500 000 записей.

, вот что мне нужно:

location_id value   date        time        name                lat     lng
3            234    2011-11-18  19:50:00    Amerongen beneden   5.40453 51.97486
4            594    2011-11-18  19:50:00    Amerongen boven     5.41194 51.97507

Я делаю это с помощью этого запроса:

SELECT location_id, value, date, time, locations.name, locations.lat, locations.lng FROM
(
SELECT location_id, value, date, time from `measurements` 
LEFT JOIN units ON (units.id = measurements.unit_id)
WHERE units.name='Waterhoogte'
ORDER BY measurements.date DESC, measurements.time DESC
) as last_record
LEFT JOIN locations on (locations.id = location_id)
GROUP BY location_id

, что занимает 30 секунд.Как я могу улучшить это?Это моя структура:

CREATE TABLE IF NOT EXISTS `locations` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `code` varchar(255) NOT NULL,
  `lat` varchar(10) NOT NULL,
  `lng` varchar(10) NOT NULL,
  `owner_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=244 ;

-- --------------------------------------------------------

--
-- Table structure for table `measurements`  
--

CREATE TABLE IF NOT EXISTS `measurements` (
  `id` int(11) NOT NULL auto_increment,
  `date` date NOT NULL,
  `time` time NOT NULL,
  `value` varchar(255) NOT NULL,
  `location_id` int(11) NOT NULL,
  `unit_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=676801 ;

-- --------------------------------------------------------

--
-- Table structure for table `owner`
--

CREATE TABLE IF NOT EXISTS `owner` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- --------------------------------------------------------

--
-- Table structure for table `units`
--

CREATE TABLE IF NOT EXISTS `units` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `unit_short` varchar(255) NOT NULL,
  `owner_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=44 ;

Какое ограничение может обрабатывать phpmyadmin?

Ответы [ 5 ]

4 голосов
/ 18 ноября 2011

Создайте индекс для unit.name, в частности, это хорошее начало. Вы также должны по-настоящему переосмыслить количество данных, которые вы извлекаете. Кто-то действительно собирается просеять столько записей? Измените свой запрос, чтобы ограничить количество записей, и подумайте об интерфейсе пользовательского интерфейса, который включает механизм подкачки.

2 голосов
/ 18 ноября 2011

вам нужно поставить индекс или уникальный индекс для unit.name.

1 голос
/ 18 ноября 2011

Добавьте следующие индексы:

Составной индекс (индекс покрытия) для unit.name и unit.id.
Сводный указатель измерений. Дата и измерения. Время.
Индекс на location.id

0 голосов
/ 18 ноября 2011
SELECT measurements.location_id, measurements.value, measurements.date, measurements.time, locations.name, locations.lat, locations.lng
FROM measurements
LEFT JOIN units ON units.id = measurements.unit_id
LEFT JOIN locations ON locations.id = measurements.location_id
WHERE units.id = 4
GROUP BY measurements.location_id
ORDER BY measurements.date DESC, measurements.time DESC
0 голосов
/ 18 ноября 2011

Вы должны попытаться создать индекс для unit.name в качестве первого шага. Но поймите, что с индексом есть компромисс - операции чтения будут быстрее, но это может замедлить операции записи. Если вас это беспокоит, или если на вас влияют медленные записи, то вы можете попытаться создать индекс с меньшим количеством символов в unit.name.

Например, чтобы объявить индекс по первым 12 символам unit.name, вы должны объявить следующее:

CREATE INDEX first_twelve ON единиц (имя (12));

Опять же, это может не понадобиться, если вы не заметите никаких побочных эффектов от простого включения указателя, но об этом следует помнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...