Я новичок в MySql и базах данных в целом.У меня есть запрос, который я собрал с помощью фрагментов из онлайн-ресурсов, а также следов и ошибок.Это действительно медленно (27 секунд), и я предполагаю, что его можно оптимизировать.Может быть, кто-то может помочь мне с этим.
Это структура данных для моей базы данных MySQL.Версия 5.1.51-0
|- purchaseID -|- customerID -|- emotionID -|- customerCountryCode -|- customerContinentCode-|
| 1 | 2345 | 0 | US | NA |
| 2 | 2345 | 3 | US | NA |
| 3 | 4456 | 0 | UK | EU |
| 3 | 4456 | 5 | UK | EU |
| 4 | 4456 | 2 | UK | EU |
| 5 | 4456 | 2 | UK | EU |
| 6 | 1234 | 0 | US | NA |
| 7 | 6678 | 0 | US | NA |
| 8 | 9900 | 0 | US | NA |
| 9 | 3334 | 0 | US | NA |
| 10 | 3334 | 4 | US | NA |
База данных используется для сохранения всех покупок, которые сделаны.Для каждой покупки customerID
, страна и континент, из которого он прибывает, сохраняются.Клиент также имеет возможность оценить свою покупку из набора из 6 эмоций.(счастлив, разочарован, ...) Выбранные им эмоции сохраняются как emotionID
.
Так что теперь мне нужен запрос, чтобы получить 6 лучших клиентов для определенного emotionID
с процентной информацией.Предположим, я искал emotionID = 0
вот что я хотел бы получить:
|- customerID -|- emotionPercent -|
| 1234 | 100 |
| 6678 | 100 |
| 9900 | 100 |
| 2345 | 50 |
| 3334 | 50 |
| 4456 | 25 |
Я использую этот запрос:
SELECT customers.customerID, Count( customers.emotionID ) / C.totalPeople * 100.0 AS emotionPercent
FROM `customers`
INNER JOIN
(SELECT customers.customerID, Count( customers.emotionID ) AS totalPeople
FROM `customers`
GROUP BY customerID) C
ON customers.customerID = C.customerID
WHERE customers.emotionID = 0
GROUP BY customers.customerID
ORDER BY emotionPercent DESC
LIMIT 0,6
Я искал ответы, нодополнительный процентный расчет сбивает меня с толку.Я нашел несколько решений, которые потребовали бы заполнения какой-то временной таблицы, но я не смог заставить ее работать.
Проблема в том, что сейчас в базе данных 140 000 записей, и этот запрос занимаетоколо 27 секунд.Это может быть правильно?Будет ли использование SQL-сервера значительно увеличить скорость?
Чего я не получу, так это: запрос самой счастливой страны в мире молниеносен (0,4 секунды), но структурно аналогичен первому запросу (27 секунд):
SELECT customers.customerCountryCode, Count( customers.emotionID ) / C.totalPeople * 100.0 AS emotionPercent
FROM `customers`
INNER JOIN
(SELECT customers.customerCountryCode, Count( customers.emotionID ) AS totalPeople
FROM `customers`
GROUP BY customerCountryCode) C
ON customers.customerCountryCode = C.customerCountryCode
WHERE customers.emotionID = 0
GROUP BY customers.customerCountryCode
ORDER BY emotionPercent DESC
LIMIT 0,6
Когда я изменяю GROUP BY
INNER Query
в этом примере на customerID
, запрос также выполняется вечно.Так что проблема заключается в группировке по customerID
.Но почему?
customerCountryCode
определяется как varchar(2)
.customerID
- это int(11)
.Вызывает ли это огромную разницу в производительности запросов?Есть ли еще подходящий тип переменной?В customerID
может быть до 8 номеров.
Много вопросов!Спасибо за чтение и любую помощь!