MySQL优化:在一个查询中使用多种模式(最常见的值)

MySQL优化:在一个查询中使用多种模式(最常见的值),mysql,optimization,statistics,analytics,Mysql,Optimization,Statistics,Analytics,我的房地产网站的一项功能允许用户订阅特定市场,并通过电子邮件接收定期更新(称为“市场分析”)。分析需要计算一些值作为模式(最常见的值)。在做了一些研究后,我了解到MySQL,特别是因为可能有多种模式,可能没有任何模式,但也因为如果列中没有至少两个值,您甚至无法获得单一模式 这就引出了这个问题 这个查询工作得很好,但问题是执行起来需要10秒,查询成本为11000,而且它甚至不包含应该在WHERE子句中的一小部分条件语句。需要包括18条其他条件语句 问题: 如何优化此查询?我应该使用更新版本的MyS

我的房地产网站的一项功能允许用户订阅特定市场,并通过电子邮件接收定期更新(称为“市场分析”)。分析需要计算一些值作为模式(最常见的值)。在做了一些研究后,我了解到MySQL,特别是因为可能有多种模式,可能没有任何模式,但也因为如果列中没有至少两个值,您甚至无法获得单一模式

这就引出了这个问题

这个查询工作得很好,但问题是执行起来需要10秒,查询成本为11000,而且它甚至不包含应该在
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'