У меня есть запрос, который занимает немного больше времени для извлечения данных из mysql db. В базе данных всего несколько записей
@Query(" SELECT COUNT(*)
FROM Message n
WHERE n.deleted = false
AND n.sent = true
AND n.senderEnvelope.user = ?1
AND n.replyToMessage IN (
SELECT DISTINCT m.replyToMessage
FROM Message m , Relationship r
WHERE m.deleted = false
AND m.sent = true
AND m.senderEnvelope.user = ?1
AND ?2 MEMBER OF r.categories
)
")
Long countUniqueRepliesSentByUser(User currentUser ,
RecommendationCategory recommendationCategory);
Есть ли способ, с помощью которого я могу оптимизировать этот запрос или изменить его по-другому. Пожалуйста помоги. заранее спасибо
Самая большая проблема заключается в том, что для этих двух таблиц нет отношения:
FROM Message m , Relationship r
Это приводит к дорогостоящему "перекрестному соединению".
Это похоже на синтаксическую ошибку; что это должно было означать?:
AND ?2 MEMBER OF r.categories
После того, как они будут исправлены, обратитесь к IN
. IN ( SELECT DISTINCT... )
плохо оптимизирован. Кроме того, DISTINCT
, как некоторый уровень, избыточен. Подумайте об изменении его на
EXISTS ( SELECT 1 FROM ...
AND n.replyToMessage = m.replyToMessage )
Предоставьте EXPLAIN SELECT...
для любого запроса, о котором вы спрашиваете.