MySQL фильтрованные пробелы и острова: избегание временных и файловых совостей?MySql

Форум по Mysql
Ответить Пред. темаСлед. тема
Anonymous
 MySQL фильтрованные пробелы и острова: избегание временных и файловых совостей?

Сообщение Anonymous »

Код: Выделить всё

CREATE TABLE `messages` (
`ID` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`Arrival` TIMESTAMP NOT NULL,
`SenderID` INT UNSIGNED NOT NULL,
-- Fields describing messages skipped
PRIMARY KEY (`SenderID`, `Arrival`, `ID`) USING BTREE,
INDEX `ID` (`ID`) USING BTREE,
INDEX `Arrival_SenderID` (`Arrival`, `SenderID`) USING BTREE
)
Таблица также разделяется по range (unix_timestamp (`grrival`)) к месяцу, выравнивается в календаре. Теперь задача состоит в том, чтобы сообщить о пробелах внутри некоторых, которые больше, чем определенное количество времени. В настоящее время запрос (@afrom и @ato установлен на декабрь 2024 года, @adays равно 5): < /p>

Код: Выделить всё

    WITH t AS (
SELECT `Messages`.`SenderID`, `Messages`.`Arrival`,
LAG(`Arrival`) OVER(PARTITION BY `Messages`.`SenderID` ORDER BY `Messages`.`Arrival`) AS `Prev`,
LEAD(`Arrival`) OVER(PARTITION BY `Messages`.`SenderID` ORDER BY `Messages`.`Arrival`) AS `Next`
FROM `Messages`
INNER JOIN `Senders` ON `Senders`.`SenderID` = `Messages`.`SenderID` AND `Senders`.`Active` IS TRUE
WHERE `Arrival` BETWEEN @aFrom AND @aTo
)
SELECT `SenderID`, IFNULL(`Prev`, @aFrom) AS `From`, `Arrival` AS `To` FROM t
WHERE TIMESTAMPDIFF(SECOND, IFNULL(`Prev`, @aFrom), `Arrival`) > @aDays * 24 * 3600
UNION
SELECT `SenderID`, `Arrival` AS `From`, IFNULL(`Next`, @aTo) AS `To` FROM t
WHERE TIMESTAMPDIFF(SECOND, `Arrival`, IFNULL(`Next`, @aTo)) > @aDays * 24 * 3600
ORDER BY `SenderID`, `From`;
< /code>
Но такой запрос имеет этот объясняющий вывод: < /p>



 id < /th>

select_ lelect_ />  Таблица < /th>
 разделы < /th>
 type < /th>
 возможно ,_keys < /th>
 key < /th>
 key_len < /th>
 ref < /th>
  невыханный />  (null) < /td>
 14430 < /td>
 100,00 < /td>
, используя где; Использование временного; Использование Filesort < /td>
< /tr>

 2 < /td>
 неполный полученное < /td>
 < /td>
 p202412 < /td>
                         />  первичный, grrival_senderid < /td>
 первичный < /td>
 4 < /td>
tstestdb.senders.senderid
справа; "> 50,00 < /td>
 Использование где; Использование индекса < /td>
< /tr>

 3 < /td>
 Union < /td>
  < /td>
 (null) < /td>
< /td> < /td> < /td> />  (null) < /td>
 (null) < /td>
 (null) < /td>
 (null) < /td>
 2700140 < /td>
 100,00 < /td>
 Использование, где < /td>
< /tr>

 (null) < /td>
 Союз-результат < /td>
  < /td> />  (null) < /td>
 all < /td>
 (null) < /td>
 (null) < /td>
 (null) < /td>
 (null) < /td>
 right; "> (null) < /td>
 (null) < /td>
 с использованием временного; Использование Filesort 



`Senders`.`SenderID`
уникальный индексирован. Общее количество активных отправителей к настоящему времени составляет около 12000 (несколько тысяч неактивных и обычно не отправляют сообщения), общее количество сообщений в месяц составляет примерно 100 миллионов. Версия MySQL для этого конкретного тестового сервера составляет 8.0.20, другие целевые серверы могут иметь другие версии 8.0.x. Есть ли способы улучшить запрос?

Подробнее здесь: https://stackoverflow.com/questions/794 ... -filesorts
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «MySql»