MySQL долгое время отклика

У меня есть действующий запрос MySQL, который выбирает последний процент занятости таблицы из каждого сообщества, введенного в мою БД, но, похоже, он сканирует всю БД записей, поскольку время поиска занимает примерно 3-4 секунды.

Может ли кто-нибудь предоставить мне более быстрый / лучший способ поиска в поле последней отметки времени для каждого сообщества с подробностями, указанными в запросе ниже? - Мне нужен запрос для выбора каждого введенного сообщества с последней меткой времени, но предел для каждого выбранного сообщества должен быть 1 (это означает, что сообщество с именем «Тестовое сообщество», возможно, будет иметь сотни представлений, но мне нужно выбрать последнюю введенную метку времени, а также с одинаковым выбором для каждого сообщества, указанного в таблице)

SELECT t1.reportID, t1.communityID, t1.region, t1.percentOccupied,  
t1.TIMESTAMP, Communities.fullName

FROM NightlyReports t1 

INNER JOIN Communities On t1.communityID = Communities.communityID

WHERE t1.TIMESTAMP = ( SELECT MAX( TIMESTAMP ) FROM NightlyReports WHERE 
t1.communityID = NightlyReports.communityID ) 

AND t1.region =  'GA' ORDER BY percentOccupied DESC
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
190
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По моему опыту, коррелированные подзапросы часто имеют довольно низкую производительность; попробуйте вместо этого:

SELECT t1.reportID, t1.communityID, t1.region, t1.percentOccupied
    , t1.TIMESTAMP, Communities.fullName
FROM NightlyReports AS t1 
INNER JOIN Communities ON t1.communityID = Communities.communityID
INNER JOIN (
   SELECT communityID, MAX( TIMESTAMP ) AS lastTimestamp
   FROM NightlyReports 
   WHERE region = 'GA'
   GROUP BY communityID
) AS lastReports ON t1.communityID = lastReports.communityID
                AND t1.TIMESTAMP = lastReports.lastTimestamp
WHERE t1.region =  'GA' 
ORDER BY percentOccupied DESC

Потрясающе, этот запрос - именно то, что я искал, вот почему я люблю ТАК .... спасибо! Не могли бы вы описать двойное ВНУТРЕННЕЕ СОЕДИНЕНИЕ? Я немного не напутал с запросами, но я не использовал это раньше

ViaTech 24.05.2018 00:54

Вы можете присоединиться к сколь угодно большому количеству таблиц (или вложенных последовательностей) (в пределах разумного, конечно), если каждая из них имеет уникальный идентификатор / псевдоним. В нескольких соединениях нет ничего особенного, так же как a + b + c на самом деле не более особенный, чем a + b.

Uueerdo 24.05.2018 01:26

Ну ладно, в этом есть смысл, я буду помнить на будущее, еще раз спасибо!

ViaTech 24.05.2018 01:30

Ваш запрос в порядке. Для этого запроса (который немного переписан):

SELECT nr.reportID, nr.communityID, nr.region, nr.percentOccupied,  
       nr.TIMESTAMP, c.fullName
FROM NightlyReports nr INNER JOIN
     Communities c
     ON nr.communityID = c.communityID
WHERE nr.TIMESTAMP = (SELECT MAX(nr2.TIMESTAMP)
                      FROM NightlyReports nr2
                      WHERE nr.communityID = nr2.communityID
                     ) AND
     nr.region =  'GA'
ORDER BY percentOccupied DESC;

Вам нужны индексы:

  • NightlyReports(region, timestamp, communityid)
  • NightlyReports(communityid, timestamp)
  • Communities(communityID) (может уже существовать)

Коррелированный подзапрос не является проблемой как таковой.

Хм ... Оглядываясь назад на этот вопрос, мне любопытно. Вы хотите сказать, что предоставленный вами альтернативный запрос с включенным коррелированным подзапросом так же быстр, как и ответ @Uueerdo? Я протестирую это, но мне любопытно, потому что вы упомянули, что подзапрос можно использовать по-другому, когда он «сам по себе не является проблемой».

ViaTech 09.06.2018 18:56

@ViaTech. . . Может быть быстрее, особенно с данными индексами. Я дал этот ответ, потому что он ближе к вашему исходному запросу.

Gordon Linoff 10.06.2018 01:51

Другие вопросы по теме