Функция моего веб-сайта по недвижимости позволяет пользователям подписываться на определенный рынок и получать регулярные обновления (называемые «анализ рынка») по электронной почте. Анализ требует, чтобы несколько значений были рассчитаны как режим (наиболее распространенное значение). Проведя некоторые исследования, я узнал, что MySQL не имеет функции MODE () , особенно потому, что может быть несколько режимов и вообще не может быть режима, а также потому, что вы даже не можете получить один режим без как минимум два значения в столбце.
Что приводит меня к этому запросу
SELECT AVG(Price) as AveragePrice,
AVG(BedroomsTotal) as AverageNumberOfBedrooms,
AVG(BathroomsTotal) as AverageNumberOfBathrooms,
AVG(SquareFeetTotal) as AverageSquareFeetTotal,
AVG(LotSize) as AverageLotSize,
AVG(AssociationFee) as AverageAssociationFee,
(SELECT PropertyType FROM (SELECT PropertyType, count(PropertyType) AS magnitude
FROM listings
GROUP BY PropertyType
ORDER BY magnitude DESC
LIMIT 1) as mpt) as MajorityPropertyType,
(SELECT magnitude FROM (SELECT PropertyType, count(PropertyType) AS magnitude
FROM listings
GROUP BY PropertyType
ORDER BY magnitude DESC
LIMIT 1) as mptc) as MajorityPropertyTypeCount,
(SELECT ArchitecturalStyle FROM (SELECT ArchitecturalStyle, count(ArchitecturalStyle) AS magnitude
FROM listings
GROUP BY ArchitecturalStyle
ORDER BY magnitude DESC
LIMIT 1) as mas) as MajorityArchitecturalStyle,
(SELECT magnitude FROM (SELECT ArchitecturalStyle, count(ArchitecturalStyle) AS magnitude
FROM listings
GROUP BY ArchitecturalStyle
ORDER BY magnitude DESC
LIMIT 1) as masc) as MajorityArchitecturalStyleCount,
AVG(YearBuilt) as AverageYearBuilt,
(SELECT PropertyCondition FROM (SELECT PropertyCondition, count(PropertyCondition) AS magnitude
FROM listings
GROUP BY PropertyCondition
ORDER BY magnitude DESC
LIMIT 1) as mpc) as MajorityPropertyCondition,
(SELECT magnitude FROM (SELECT PropertyCondition, count(PropertyCondition) AS magnitude
FROM listings
GROUP BY PropertyCondition
ORDER BY magnitude DESC
LIMIT 1) as mpcc) as MajorityPropertyConditionCount
FROM srep.active_listings
WHERE concat(City, ', ', StateOrProvince)
LIKE "Boston, MA";
Этот запрос работает просто отлично, но проблема в том, что для его выполнения требуется 10 секунд со стоимостью запроса 11 000, и он даже не содержит доли условных операторов, которые должны быть в предложении WHERE
. Есть еще 18 условных выражений, которые необходимо включить.
Вопрос (ы):
Как я могу оптимизировать этот запрос? Должен ли я использовать более новую версию MySQL? Должен ли я использовать другую базу данных в целом?
?
Текущий план выполнения
Результаты