当前位置: 首页 > 面试题库 >

如何处理大型mysql查询

娄弘
2023-03-14
问题内容

我有以下查询:

SELECT  p2c.pid AS productNumber,
        p.name AS productName
    ,   (
            SELECT COUNT(*)
            FROM   products2customers
            WHERE  pid = p2c.pid
        ) AS registered
    ,   (
            SELECT COUNT(*)
            FROM   products2customers
            WHERE  pid = p2c.pid
               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()
        ) AS inWarranty
    ,   (
            SELECT COUNT(*)
            FROM   products2customers
            WHERE  pid = p2c.pid
               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) < CURDATE()
        ) AS outOfWarranty
    ,   (
            SELECT DATE_FORMAT( MAX( from_unixtime(purchased) ), '%d.%m.%Y')
            FROM   products2customers
            WHERE  pid = p2c.pid
        ) AS lastPurchased
    ,   (
            SELECT DATE_FORMAT( date_add( MAX( from_unixtime(purchased) ), INTERVAL 5 YEAR), '%d.%m.%Y')
            FROM   products2customers
            WHERE  pid = p2c.pid
        ) AS warrantyUntil
FROM    (
            SELECT DISTINCT
                p2c.pid
            FROM
                products2customers p2c
        ) AS p2c
JOIN
    products p
ON
    p.id = p2c.pid
ORDER BY
    inWarranty DESC

查询在具有25.000行的数据库表上执行。该查询的执行时间约为40秒。结果将显示在网页上,因此等待40秒以获取结果并不是很好。

有没有一种方法可以执行此查询并保存其输出?因为如果每天晚上执行此查询就足够了。

最好的方法是什么?我应该创建一个cronjob并执行此查询并将结果写入数据库吗?或者,还有更好的方法?

或者我可以优化此查询以使其更快?


问题答案:

我认为所有这些相关的子查询都在杀死。试试这个:

SELECT  p2c.pid AS productNumber,
        p.name AS productName,
        COUNT(*) AS registered,
        SUM(date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()) AS inWarranty,
        SUM(date_add(from_unixtime(purchased), INTERVAL 5 YEAR) < CURDATE()) AS outOfWarranty,
        DATE_FORMAT( MAX( from_unixtime(purchased) ), '%d.%m.%Y') AS lastPurchased,
        DATE_FORMAT( date_add( MAX( from_unixtime(purchased) ), INTERVAL 5 YEAR), '%d.%m.%Y') AS warrantyUntil
FROM products2customers p2c
JOIN products p ON p.id = p2c.pid
GROUP BY p2c.pid
ORDER BY inWarranty DESC


 类似资料:
  • 想知道如何看待mysql json专栏? category_ids例如) [19, 102, 108] 如果我想搜索包含类别id 102的产品列表,如何使用queryDSL进行查询? 我尝试了JsonNode类型,但它不起作用。

  • 问题内容: 我正在使用MySQL数据库,我想知道是否同时进行多个(500个或更多)查询以便从多个表中获取信息,这些查询如何处理?顺序还是并行? 问题答案: 查询总是在多个会话(即客户端连接)之间并行处理。单个连接上的所有查询都一个接一个地运行。可以根据您可用的服务器资源来配置多个连接之间的并行度。 通常,某些操作在各个查询会话之间被保护(称为事务)。这些由InnoDB后端支持,但MyISAM表不受

  • 问题内容: 我有一个查询,看起来像这样: ORDER BY如何运作?它会排序所有记录,然后获取前20条记录,还是会获取20条记录并按字段排序? 如果是最后一篇,则不能保证您会真正获得最新的20篇文章。 问题答案: 它将先排序,然后得到前20。数据库还将处理子句中的所有内容。

  • 问题内容: 我正在制作一个运行ASP.NET WebService的Android应用程序。Webservice发送一个JSON对象,应用程序解析该对象并显示在屏幕上。在一种情况下,JSON对象太大,并且出现Findered Binder Transaction错误。我的解决方案是获取该JSON对象并将其嵌入到应用程序代码中,这样就无需从服务器获取该JSON对象。你能告诉我我可以做的其他事情吗?还

  • 问题内容: 我收到此异常: 源自此代码: 哪里是。 所以这对我来说很好- 我知道数据库中存在零日期,我需要能够读取这些日期并将其转换为下游数据结构中的适当数据(可能为空)。问题是我不知道如何检索它并得到“软”错误。我考虑过将这一行包装在SQLException的try / catch中,但了解这会破坏ResultSet的有效性。 是否有可能以其他方式读取此值而不会引发SQLException? 问

  • 我正在处理非常大的文件,并使用Spring集成来处理它们。我想知道使用Spring集成和提供的DSL处理这些问题的最佳和最有效的方法是什么。我有一个测试CSV文件,它有大约30K条记录,我正在使用filespliter组件将每一行读入内存,然后根据分隔符再次拆分,以获得我需要的列。 下面的代码段。