Я очень новичок в кодах SQL, я выбираю только несколько столбцов и использую в основном функцию GROUP BY
, но мой код занимает 2 минуты, чтобы показать результат, возможно, это не длинный запрос, но мне нужно сделать быстрее. Как сделать SQL-запрос быстрее?
Для моего кода у меня есть таблица с совпадениями лиг;
Пример:
CustomerID MatchDate League Matches HomeTeam AwayTeam
------------------------------------------------------------------------------------------------------------------------
1 11-12-2006 La Liga Barcelone-R.Madrid Barcelona RealMadrid
2 10-10-2006 Premier League Everton-Arsenal Everton Arsenal
3 09-10-2006 Premier League Arsenal-Tottenham Barcelona RealMadrid
4 10-10-2006 Bundesliga Bayern-Mainz Bayern MainZ
Моя цель - подсчитать общее количество идентификаторов для каждого матча, предоставленного домашней и выездной командам, чтобы найти общее количество просмотров для каждой команды и группы по лигам, а также по командам и сезонам. Одни и те же команды могут быть HomeTeam и AwayTeam, поэтому я использовал этот код.
SELECT League, SUM(totalnum), Teams, Season FROM
(
(SELECT DATE_FORMAT(MatchDate, '%Y') as 'Season', HomeTeam as Teams, League, count(distinct CustomerID) as "totalnum"
FROM MY_TABLE GROUP BY League, Teams, Season )
UNION ALL
(SELECT DATE_FORMAT(MatchDate, '%Y') as 'Season', AwayTeam as Teams, League, count(distinct CustomerID) as "totalnum"
FROM MY_TABLE GROUP BY League, Teams, Season )
) aa
GROUP BY League, Teams, Season
ORDER BY totalnum DESC
Я могу получить результат, но мне нужно короче. Какие моменты могут повлиять на мой запрос.
count(distinct ID)
, поэтому я предполагаю, что вMY_TABLE
один и тот же идентификатор клиента появляется несколько раз, но вы хотите подсчитать уникальный идентификатор клиента. И вопрос: ЕСЛИ CustomerID = 1 наблюдает за матчем, в котором «Барселона» является гостевой командой, а CustomerID = 1 также наблюдает за матчем, в котором «Барселона» является домашней командой, то как CustomerID = 1 должен учитываться в команде = Barcelona? В вашем запросе ID = 1 считается дважды. - person noymer   schedule 07.01.2018full table scan
, он все равно может извлечь выгоду из индексов. В этом случае индексы могут избежать необходимости в шаге сортировки, который в настоящее время требуется из-заGROUP BY
. - person MatBailie   schedule 07.01.2018COUNT()
уникальные домашние клиенты, а затемCOUNT()
уникальные выездные клиенты, а затемSUM()
их. Это означает, что любой, кто был на домашнем матче И на выездном матче, засчитывается дважды. Это предназначено? - person MatBailie   schedule 07.01.2018INDEX SCAN
обычно будет иметь меньшую или равную стоимостьTABLE SCAN
. Только если индекс имеет недостаточное покрытие (и поэтому ему необходимо присоединиться к базовой таблице),INDEX SCAN
обычно будет давать более высокую стоимость, чемTABLE SCAN
. Это плюс удаление шагаSORT
означает, что да индекс может снизить стоимость. (Обратите внимание, что я уточняю свои предложения, вы делаете абсолютные / категоричные утверждения, которые редко всегда верны) - person MatBailie   schedule 07.01.2018FULL INDEX SCAN
, чем с помощьюFULL TABLE SCAN
. Что касается стоимости обслуживания индекса, это гораздо более широкое обсуждение, чем один запрос: как часто записываются данные и какова повышенная стоимость, как часто выполняются запросы и какова экономия затрат, приносят ли индексы пользу другим запросам, будет ли триггерная / производная таблица / и т. д. лучшим решением. ВСЕ индексы связаны с расходами на запись, это звучит так, как будто вы выдвинули соломенный аргумент. - person MatBailie   schedule 07.01.2018innodb_buffer_pool_size
? - person Rick James   schedule 08.01.2018