MySQL优化:在一个查询中使用多种模式(最常见的值)
我的房地产网站的一项功能允许用户订阅特定市场,并通过电子邮件接收定期更新(称为“市场分析”)。分析需要计算一些值作为模式(最常见的值)。在做了一些研究后,我了解到MySQL,特别是因为可能有多种模式,可能没有任何模式,但也因为如果列中没有至少两个值,您甚至无法获得单一模式 这就引出了这个问题 这个查询工作得很好,但问题是执行起来需要10秒,查询成本为11000,而且它甚至不包含应该在MySQL优化:在一个查询中使用多种模式(最常见的值),mysql,optimization,statistics,analytics,Mysql,Optimization,Statistics,Analytics,我的房地产网站的一项功能允许用户订阅特定市场,并通过电子邮件接收定期更新(称为“市场分析”)。分析需要计算一些值作为模式(最常见的值)。在做了一些研究后,我了解到MySQL,特别是因为可能有多种模式,可能没有任何模式,但也因为如果列中没有至少两个值,您甚至无法获得单一模式 这就引出了这个问题 这个查询工作得很好,但问题是执行起来需要10秒,查询成本为11000,而且它甚至不包含应该在WHERE子句中的一小部分条件语句。需要包括18条其他条件语句 问题: 如何优化此查询?我应该使用更新版本的MyS
WHERE
子句中的一小部分条件语句。需要包括18条其他条件语句
问题:
如何优化此查询?我应该使用更新版本的MySQL吗?我应该使用不同的数据库吗
使用另一种语言(如Python)获取列的模式。下面是一个使用Web API的示例。您必须先安装mysqlclient
和flask
软件包,然后此代码才能工作
App.py
使用所有10个属性进行测试运行
如您所见,Python(与MySQL相比)需要十分之一的时间才能获得相同的结果。一个改进是减少了一半的子查询:
( SELECT PropertyType
FROM
(
SELECT PropertyType, count(PropertyType) AS magnitude
FROM listings
GROUP BY PropertyType
ORDER BY magnitude DESC
LIMIT 1) as mpt
) as MajorityPropertyType,
-->
此特定查询需要索引(PropertyType)
(除非它已经是主键
)
另一个改进是避免在函数调用中隐藏索引列:
WHERE concat(City, ', ', StateOrProvince) LIKE "Boston, MA"
-->
连同综合指数(城市、州或省)
(按任意顺序)。这将避免扫描整个表,而只查看Boston MA行
即使有一个模式
函数,它也可能不会更快——它基本上要做代码所做的事情。谢谢:)知道如何优化查询很好。在与这段代码搏斗了一段时间后,我最终使用PHP来计算API中某个列的模式。但由于这是一个关于MySQL的问题,我会将您的答案标记为正确答案。@ihodonald-有关索引和优化的更多信息,请参阅。
( 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 PropertyType
FROM listings
GROUP BY PropertyType
ORDER BY COUNT(*) DESC
LIMIT 1
) as MajorityPropertyType
WHERE concat(City, ', ', StateOrProvince) LIKE "Boston, MA"
WHERE City = 'Boston' AND StateOrProvince = 'MA'