我有以下查询:
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并执行此查询并将结果写入数据库吗?或者有更好的方法吗?
或者我可以优化此查询,以使其更快?
答案 0 :(得分:2)
我认为所有相关的子查询都在扼杀你。试试这个:
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
答案 1 :(得分:1)
可以从Explain Plan
开始,看看是否可以通过创建索引来加速任何部分。
答案 2 :(得分:1)
把它放到一个cron作业中:
CREATE TABLE products_warrany SELECT p2c.pid AS productNumber, ...
稍后使用以下查询而不是原始的长查询:
SELECT * FROM products_warrany ORDER BY ...
您还可以运行其他过滤,排序等功能。 Reference.