Повышение эффективности моего SQL

У меня есть таблица MySQL LIKES (likeID, userID, objectID, likeDate), и я хотел бы иметь возможность подсчитать все «понравившиеся», которые были сделаны после этого пользователя.

Обычно я получаю дату:

SELECT likeDate FROM LIKES WHERE userID = 

а затем найдите все даты и подсчитайте возвращаемую строку (или используйте MySQL COUNT) следующим образом:

SELECT * FROM LIKES WHERE likeDate > 

Тем не менее, я уверен, что есть способ сделать это в одном запросе, а не делать два вызова в базе данных. Может ли кто-нибудь помочь?

благодаря

2
nl ja de

3 ответы

Подайте результат первого запроса непосредственно во второй:

SELECT COUNT(*)
FROM LIKES
WHERE likeDate > (
    SELECT max(likeDate)
    FROM LIKES
    WHERE userID = 
)

Однако обратите внимание, что вам нужно добавить использование max() в свой первый запрос.

Этот запрос должен быть самым быстрым способом получить ваш ответ. Чтобы обеспечить максимальную производительность, добавьте индексы как для userID , так и для likeDate :

create index likes_userId on likes(userID);
create index likes_likeDate on likes(likeDate);
2
добавлено
Точно нет! Его запрос сосет - его O (n), мой O (1). т.е. его подзапрос выполняется один раз для каждой строки таблицы! На самом деле я не могу представить себе худший запрос, если он даже работает.
добавлено автор Bohemian, источник
@Argeman, вероятно, но это довольно специфический индекс использования, где один на простой идентификатор пользователя будет более универсальным. я бы порекомендовал попробовать все варианты и посмотреть, что работает лучше всего, и сбалансировать то, насколько просто вы можете хранить вещи
добавлено автор Bohemian, источник
@lc даже в этом случае вы можете делать то, что вы предлагаете в качестве объединения, что намного эффективнее, чем коррелированный подзапрос, которого следует избегать, как чума. В качестве упражнения вы должны изменить свой ответ на соединение (которое я бы поднял)
добавлено автор Bohemian, источник
Спасибо @Bohemian, но не ответ lc немного более эффективен?
добавлено автор tommyd456, источник
Ха-ха - хорошо, спасибо за это - я вижу вашу точку сейчас
добавлено автор tommyd456, источник
@Bohemian. Ваш комментарий немного суровый, учитывая, что OP никогда не квалифицировался, и ему нужен только один результат. Когда я прочитал вопрос, «... а затем найду все даты и подсчет ...» Я понял, что ФП хочет, чтобы число понравилось после каждой подобной даты. Мой запрос делает именно это, дает вам один счет для каждой даты, возвращенной в запросе в вопросе. Я думаю, вам, должно быть, повезло с вашим ESP.
добавлено автор lc., источник
Для индексов может быть лучше построить два индекса: один на обоих строках userID, likeDate и один на asDate. Таким образом вы бы позволили db быстрее найти max (likeDate) (намного)
добавлено автор Argeman, источник
SELECT l1.likeDate, 
    (SELECT COUNT(1) FROM LIKES l2 WHERE l2.likeDate > l1.likeDate) AS likesAfter
FROM LIKES l1
WHERE userID = ?
GROUP BY l1.likeDate

Или как соединение,

SELECT l1.likeDate, COUNT(1)
FROM LIKES l1
LEFT OUTER JOIN LIKES l2 ON l2.likeDate > l1.likeDate
WHERE userID = ?
GROUP BY l1.likeDate
1
добавлено
Здесь есть несколько хороших ответов - любые идеи, которые являются наиболее эффективными?
добавлено автор tommyd456, источник
SELECT * FROM LIKES WHERE likeDate > 
IFNULL((SELECT max(likeDate) FROM LIKES WHERE userID =  
                                  adn  objectId=),0)
and objectId=
0
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)