mysql的優化方法有很多與oracle類似,而且mysql對子查詢的支持更差.
下面是一個mysql的標量子查詢
SELECT DISTINCT
t.act_id,
(
SELECT
count(0)
FROM
t
WHERE
to_days(now()) - to_days(time_stamp) = 1
) yesterday,
(
SELECT
count(0)
FROM
t
WHERE
to_days(time_stamp) = to_days(now())
) today,
(
SELECT
count(0)
FROM
t
WHERE
act_id = t.act_id
) total
FROM
t t
WHERE
EXISTS (
SELECT
1
FROM
a a
WHERE
a.shop_id = 'one_shop_id'
AND a.id = t.act_id
);
裏面用了不必要的標量子查詢,前兩個無關聯條件,第三個根本不需要用子查詢,所以效率很低,需要15s
改後如下:
SELECT a.act_id, a.total, y.yesterday, t.today
FROM (SELECT t.act_id, COUNT(*) AS total
FROM t
INNER JOIN a
ON (a.id = t.act_id)
WHERE a.shop_id = 'one_shop_id'
GROUP BY act_id) a,
(SELECT COUNT(0) AS yesterday
FROM t
WHERE to_days(now()) - to_days(time_stamp) = 1) y,
(SELECT COUNT(0) AS today
FROM t
WHERE to_days(time_stamp) = to_days(now())) t;
查詢只需要0.1s