mysql - 如何制作具有更好性能的 COUNT?
问题描述
我正在使用这个查询,它需要 3 秒才能运行。表通告有 255k 行,表地址有 30k 行。
SELECT COUNT(DISTINCT ad.id) as total_address
FROM (
SELECT
ad.id, an.id as announce_id,
an.buy_price as buy_price,
an.rental_price as rental_price,
(SELECT Count(*) FROM owner_address
WHERE address_id = ad.id) as totalOwnersAd,
(SELECT Count(*) FROM owner_announce
WHERE announce_id = an.id) as totalOwnersAn
FROM addresses ad
RIGHT JOIN announces an ON ad.id = an.address_id
WHERE an.name = 'tralala' and ad.name = 'tralala'
) ad
和子查询:
SELECT
ad.id, an.id as announce_id,
an.buy_price as buy_price,
an.rental_price as rental_price,
(SELECT Count(*) FROM owner_address
WHERE address_id = ad.id) as totalOwnersAd,
(SELECT Count(*) FROM owner_announce
WHERE announce_id = an.id) as totalOwnersAn
FROM addresses ad
RIGHT JOIN announces an ON ad.id = an.address_id
WHERE an.name = 'tralala' and ad.name = 'tralala'
运行需要 17 毫秒。
为什么我COUNT
的需要这么长时间?
我正在使用 MySql。
由于我的动态过滤器,我需要加入announces
和表格。addresses
例如,当我需要计算公告列 X 等于 Y 的地址时。
编辑:
我试过了:
SELECT COUNT(DISTINCT ad.address_id) as total_address
FROM announces an JOIN (
SELECT adds.id as address_id
FROM (
SELECT id,
(SELECT Count(*) FROM owner_address WHERE address_id = ad.id) as totalOwnersAd
from addresses ad
) as adds
) as ad ON ad.address_id = an.address_id
WHERE
( an.bedroom = 2 )
它快了 10%,但仍然需要很长时间。当我有地址过滤器时它会更快。
反正有索引子查询表吗?
解决方案
我只是好奇你为什么不使用:
select count(distinct an.address_id)
from announces;
达到相同值似乎是一种更简单的方法。
编辑:
对于您修改后的查询,这更简单:
SELECT COUNT(DISTINCT an.address_id)
FROM addresses ad JOIN
announces an
ON ad.id = an.address_id
WHERE an.name = 'tralala' and ad.name = 'tralala';
是不必要的right join
,因为WHERE
条件将它变成了inner join
. 子查询和附加列不是必需的。