left join same table两次慢查询
left join same table twice slow query
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS sell_xx
FROM xxs
ORDER BY xx_id DESC) AS xxs
ON xxs.yy_type = zz.zz_coin
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS old_sell_xx
FROM xxs
WHERE xx_time < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24 HOUR))
ORDER BY xx_id DESC) AS old_xxs
ON old_xxs.coin_type = zz.zz_coin
所以我的查询中有 2 个左联接,select 来自同一个 table,但其中一个是 where。由于它与查询中的 table I select 相同,因此速度非常慢。我该如何解决这个问题?
首先,不需要在派生的table中使用order by
子句。
其次,您的第一个派生 table 只是选择了 table 中的所有记录,所以我看不出它有什么意义。
试试这个:
LEFT JOIN xxs
ON xxs.yy_type = zz.zz_coin
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS old_sell_xx
FROM xxs
WHERE xx_time < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24 HOUR))
) AS old_xxs
ON old_xxs.coin_type = zz.zz_coin
或者这样:
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS sell_xx
FROM xxs
WHERE xx_time >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24
) AS xxs
ON xxs.yy_type = zz.zz_coin
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS old_sell_xx
FROM xxs
WHERE xx_time < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24 HOUR))
) AS old_xxs
ON old_xxs.coin_type = zz.zz_coin
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS sell_xx
FROM xxs
ORDER BY xx_id DESC) AS xxs
ON xxs.yy_type = zz.zz_coin
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS old_sell_xx
FROM xxs
WHERE xx_time < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24 HOUR))
ORDER BY xx_id DESC) AS old_xxs
ON old_xxs.coin_type = zz.zz_coin
所以我的查询中有 2 个左联接,select 来自同一个 table,但其中一个是 where。由于它与查询中的 table I select 相同,因此速度非常慢。我该如何解决这个问题?
首先,不需要在派生的table中使用order by
子句。
其次,您的第一个派生 table 只是选择了 table 中的所有记录,所以我看不出它有什么意义。
试试这个:
LEFT JOIN xxs
ON xxs.yy_type = zz.zz_coin
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS old_sell_xx
FROM xxs
WHERE xx_time < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24 HOUR))
) AS old_xxs
ON old_xxs.coin_type = zz.zz_coin
或者这样:
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS sell_xx
FROM xxs
WHERE xx_time >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24
) AS xxs
ON xxs.yy_type = zz.zz_coin
LEFT JOIN (SELECT xx_coinType AS yy_type, xx_sell AS old_sell_xx
FROM xxs
WHERE xx_time < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 24 HOUR))
) AS old_xxs
ON old_xxs.coin_type = zz.zz_coin