回答

收藏

如何处理大型mysql查询

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

我有以下查询:: H8 p$ a2 j5 P+ |, G
SELECT  p2c.pid AS productNumber,2 ?- c: w% D; a" f
        p.name AS productName* g- K( Z9 e1 E& ?' O
    ,   (* X) T, q6 |: x- N% K; ?/ G
            SELECT COUNT(*)' J3 @: D' k! X+ Z4 x' t4 x1 r
            FROM   products2customers
. g0 A& j7 g' ?" o" o( \4 b* N2 ?& B            WHERE  pid = p2c.pid
% n1 {% D2 T* B8 u& O* g8 ]' U  G        ) AS registered. E$ o$ V. w% A5 @9 ]# ~- E
    ,   (( n3 W: Y7 I! f  r+ C, T
            SELECT COUNT(*)' ^) v* G, ?* j) H+ {# J
            FROM   products2customers7 [4 o5 m! q# G2 d- ?: Z' }7 H3 F
            WHERE  pid = p2c.pid0 M; F: B$ R% J( H( H. z7 `) P
               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()
) ?1 j4 a+ L1 ]' J, `' l( f  c        ) AS inWarranty: o& b8 R0 k7 Q% g2 b" w+ S, Z
    ,   (: o" x3 i- e9 `" c8 X
            SELECT COUNT(*); i4 F1 l8 H* `" ~2 |
            FROM   products2customers" ~; a+ s" C) s( N7 j
            WHERE  pid = p2c.pid6 q# Y; S& s. I5 x, S% l! X7 X
               AND date_add(from_unixtime(purchased), INTERVAL 5 YEAR) 查询在具有25.000行的数据库表上执行。该查询的执行时间约为40秒。结果将显示在网页上,因此等待40秒以获取结果并不是很好。3 m2 D4 g% e4 o9 F1 e/ X6 N
有没有一种方法可以执行此查询并保存其输出?因为如果每天晚上执行此查询就足够了。
% t5 m5 {" Y" I  \: G0 L/ E最好的方法是什么?我应该创建一个cronjob并执行此查询并将结果写入数据库吗?或者,还有更好的方法?  z3 J/ r* `. _6 h8 [* Z+ s
或者我可以优化此查询以使其更快?/ H( k# z" @5 C- Y1 l9 u
               
' ~, a! p! q  Y. P0 {; q# ^解决方案:5 Z! V* F6 s% J* l
               
5 E% D% N, I2 @1 W- s2 x$ x- y* w1 D- s, r4 K" D% M

) L, u% E1 g9 H0 N9 w, W                我认为所有这些相关的子查询都在杀死。试试这个:, [9 ]- C1 B  b$ V2 g/ F( C
SELECT  p2c.pid AS productNumber,
( e: O' d8 F. K4 [* J+ i        p.name AS productName,
$ ?, ^: f% L& w& y! f& j        COUNT(*) AS registered,: E: x% B0 R$ K
        SUM(date_add(from_unixtime(purchased), INTERVAL 5 YEAR) >= CURDATE()) AS inWarranty,
# a2 {+ I% v% V3 @' ?0 \        SUM(date_add(from_unixtime(purchased), INTERVAL 5 YEAR) < CURDATE()) AS outOfWarranty,$ q" w, \' c5 G9 o
        DATE_FORMAT( MAX( from_unixtime(purchased) ), '%d.%m.%Y') AS lastPurchased,
1 Q. ^8 q5 Z9 V; c& F        DATE_FORMAT( date_add( MAX( from_unixtime(purchased) ), INTERVAL 5 YEAR), '%d.%m.%Y') AS warrantyUntil2 d5 I: E0 B9 K) a; Q
FROM products2customers p2c
9 D, T3 s; m) d9 y* L, S1 sJOIN products p ON p.id = p2c.pid" x8 Y- g) v0 z7 \( R# a
GROUP BY p2c.pid  G0 U; I, C- ?5 p+ p
ORDER BY inWarranty DESC
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则