Сложный Макс Заявление MySQL - PullRequest
0 голосов
/ 14 февраля 2019

У меня один запрос, чтобы получить 10 Максимальное значение из базы данных MySQL.Возвращено правильное значение, но проблема в том, что для получения значения

потребовалось много времени. Это значение представляет собой данные процессора с устройства.Итак, с одного устройства приходится около 6 Тип модуля .Для каждого типа модуля есть около 120 номер модуля .Из каждого номера модуля есть 2 слота (активный и резервный) .Номер модуля размещается в каркасе.Мне нужно получить 10 Номер модуля, который имеет наибольшее значение е.

Я пытался использовать свой собственный запрос, он вернул правильное значение, но слот неправильный.Затем я нашел запрос из переполнения стека ( MySQL запрос, MAX () + GROUP BY )

Это моя структура таблицы:

Create Table: CREATE TABLE `Router_Modul_CPU` (
  `date_id` date NOT NULL,
  `hour_id` time NOT NULL,
  `NE` varchar(50) NOT NULL,
  `modul_number` int(11) NOT NULL,
  `modul_type` varchar(50) NOT NULL,
  `slot` int(11) NOT NULL,
  `subrack` int(11) DEFAULT NULL,
  `mean_memory` float DEFAULT NULL,
  `peak_memory` float DEFAULT NULL,
  PRIMARY KEY (`date_id`,`hour_id`,`NE`,`modul_number`,`modul_type`,`slot`),
  KEY `index_key` (`date_id`,`hour_id`,`NE`,`modul_number`,`modul_type`,`slot`,`subrack`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Это мой запрос :

select
    Router_Modul_CPU.NE,
    Router_Modul_CPU.modul_number,
    Router_Modul_CPU.slot,
    Router_Modul_CPU.subrack
from Router_Modul_CPU
inner join
(
    select modul_number, max(peak_memory) as maks
    from `Router_Modul_CPU`
    group by modul_number, NE, subrack
) maxt on
   (Router_Modul_CPU.modul_number = maxt.modul_number and
    Router_Modul_CPU.peak_memory = maxt.maks)
 where modul_type='SPU' and NE='R-D5-SBT' and date_id='2019-02-14'
limit 10

Потребовалось около 40-50 секунд , чтобы получить данные, и эти запросы только для одного устройства

Все эти данные были вставлены каждые 5 минут в эту таблицу.Теперь в этой таблице около 25 миллионов строк.

Есть ли какие-либо настройки для моей таблицы или какие-либо предложения по повышению эффективности моего запроса?

Спасибо

1 Ответ

0 голосов
/ 14 февраля 2019

Есть несколько проблем с вашим текущим запросом.Во-первых, предложение GROUP BY в подзапросе не имеет особого смысла.Во-вторых, вы используете LIMIT без ORDER BY во внешнем запросе, что также не имеет смысла.Я предлагаю следующую версию:

SELECT
    r1.NE,
    r1.modul_number,
    r1.slot,
    r1.subrack
FROM Router_Modul_CPU r1
INNER JOIN
(
    SELECT modul_number, MAX(peak_memory) AS maks
    FROM Router_Modul_CPU
    GROUP BY modul_number
) r2
    ON r1.modul_number = r2.modul_number AND
       r1.peak_memory = r2.maks
WHERE
    r1.modul_type = 'SPU' AND
    r1.NE = 'R-D5-SBT'    AND
    r1.date_id = '2019-02-14'

Я пропустил предложение LIMIT, и если вы хотите его использовать, вам придется также предоставить предложение ORDER BY.

Относительно того, как сделать это лучше, можно добавить следующий индекс в таблицу Router_Model_CPU:

CREATE INDEX your_idx ON Router_Model_CPU (modul_number, peak_memory);

С этим индексом MySQL, скорее всего, предпочтет присоединиться к нему.чем ваш текущий подзапрос.Индекс должен работать и использоваться, потому что подзапрос просто запрашивает максимальное значение peak_memory на группу.

...