回答

收藏

如何处理大型mysql查询

技术问答 技术问答 305 人阅读 | 0 人回复 | 2023-09-14

我有以下查询:
9 z, g- Q7 h! H- g# NSELECT  p2c.pid AS productNumber,- Q- X" v- w' R% r$ @: @
        p.name AS productName: x% Q3 l; ~+ t/ L2 J
    ,   (3 k8 M# O, [5 U$ W7 [* X
            SELECT COUNT(*)3 P$ M' O- `% k# q' W
            FROM   products2customers) i; [+ p& |& Q7 F3 f7 B% y; }
            WHERE  pid = p2c.pid6 M+ ?+ E8 c/ ]6 b7 q
        ) AS registered+ ~; |, z/ ~- j1 E# T
    ,   (2 v3 R& a; H! z! j+ t5 n3 F% V
            SELECT COUNT(*)& B5 j* X' o% g% V5 j3 n# a. f
            FROM   products2customers$ y6 F4 c. p4 d* Q
            WHERE  pid = p2c.pid- A, _8 j! j7 y9 h- h3 Q
               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()3 }, ]4 U! j' w5 D
        ) AS inWarranty: s) z3 [( T, o0 _. s
    ,   (* @4 e: N- a3 M; Y, b( n% o% ^
            SELECT COUNT(*)
* ~4 c/ `7 N0 q3 `            FROM   products2customers; }# F4 Q& m; @6 u2 E. O
            WHERE  pid = p2c.pid
2 }( ?! L* J4 ^; V/ Z. ^8 `               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) 查询在具有25.000行的数据库表上执行。该查询的执行时间约为40秒。结果将显示在网页上,因此等待40秒以获取结果并不是很好。
  F& [2 q7 h2 H有没有一种方法可以执行此查询并保存其输出?因为如果每天晚上执行此查询就足够了。
. C! i% m( @3 j4 e- }* a最好的方法是什么?我应该创建一个cronjob并执行此查询并将结果写入数据库吗?或者,还有更好的方法?; L) A) {3 G7 Y" K" \# [$ `' }
或者我可以优化此查询以使其更快?, s& j: F& ~9 V2 B/ X* I
               
- `9 X, U4 U" \8 i解决方案:' a7 O# ?: e6 ~# Z) t* \7 |6 R
               
( l! B* i4 a+ w* f1 A+ P' \7 q/ D" R( J! X6 Z7 ^4 u% Z

+ H+ y. P& D* V1 Z) @$ A7 \- j1 k                我认为所有这些相关的子查询都在杀死。试试这个:$ ?& z* w& Z( N
SELECT  p2c.pid AS productNumber,& Z( a4 M# l5 ^& i. h# e& M
        p.name AS productName,4 Z! r/ @; u) ^: R# \
        COUNT(*) AS registered,/ T) u& M0 w( H' v3 D( \" o! G
        SUM(date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()) AS inWarranty,# N2 M: L# V  y+ R
        SUM(date_add(from_unixtime(purchased), INTERVAL 5 YEAR) < CURDATE()) AS outOfWarranty,0 V: J' d' ?8 U% E' F! h# ~
        DATE_FORMAT( MAX( from_unixtime(purchased) ), '%d.%m.%Y') AS lastPurchased,
" U0 ?7 w+ o* K4 `/ ?% h$ x. y        DATE_FORMAT( date_add( MAX( from_unixtime(purchased) ), INTERVAL 5 YEAR), '%d.%m.%Y') AS warrantyUntil" E% V6 l9 M3 a
FROM products2customers p2c
. V  U' e' ?4 [4 @JOIN products p ON p.id = p2c.pid' O$ [7 A# B/ t" M
GROUP BY p2c.pid
5 ?+ {+ _2 H9 B4 u4 CORDER BY inWarranty DESC
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则