【发布时间】:2019-10-23 01:55:53
【问题描述】:
假设我有 2 张桌子。一个包含汽车制造商的名称及其 ID,第二个包含有关汽车型号的信息。我需要从第一个表中选择其中的几个,但按从第二个表数据链接的数量对它们进行排序。
目前,我的查询如下所示:
SELECT DISTINCT `manufacturers`.`name`,
`manufacturers`.`cars_link`,
`manufacturers`.`slug`
FROM `manufacturers`
JOIN `cars`
ON manufacturers.cars_link = cars.manufacturer
WHERE ( NOT ( `manufacturers`.`cars_link` IS NULL ) )
AND ( `cars`.`class` = 'sedan' )
ORDER BY (SELECT Count(*)
FROM `cars`
WHERE `manufacturers`.cars_link = `cars`.manufacturer) DESC
对于我只有几十 mb 的踏板车来说,它工作正常。但是现在我需要为汽车表做同样的事情,它的大小只有几百兆字节。问题是查询需要很长时间,有时甚至会导致 nginx 超时。另外,我认为,我拥有所有必要的数据库索引。上面的查询有什么替代方法吗?
【问题讨论】:
-
manufacturers.cars_link和cars.manufacturer是否已编入索引?如果不是,那很可能是问题所在。发布explain <your query>的输出也会对我们有所帮助。 -
你为什么使用
select distinct?样本数据、期望的结果以及对您想要做什么的解释都会有所帮助。