我有两个表:
CREATE TABLE `album` (
`album_id` int(10) unsigned NOT NULL,
`artist_id` int(10) unsigned NOT NULL,
`album_type_id` int(10) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`first_released` year(4) NOT NULL,
`country_id` smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (`album_id`),
KEY `artist_id` (`artist_id`),
KEY `name` (`name`)
) ENGINE=InnoDB
CREATE TABLE `artist` (
`artist_id` int(10) unsigned NOT NULL,
`type` enum('Band','Person','Unknown','Combination') NOT NULL,
`name` varchar(255) NOT NULL,
`gender` enum('Male','Female') DEFAULT NULL,
`founded` year(4) DEFAULT NULL,
`country_id` smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (`artist_id`),
KEY `name` (`name`)
) ENGINE=InnoDB;
我的第一个查询:
select ar.name, count(*)
from artist ar
join album al on ar.artist_id=al.artist_id
group by ar.artist_id
limit 10;
在 0.00 秒内生成结果集。
我想对结果进行排序,所以我添加了“order by 2 desc”:
select ar.name, count(*)
from artist ar
join album al on ar.artist_id=al.artist_id
group by ar.artist_id
order by 2 desc
limit 10;
但是现在结果集要超过5秒,太慢了。
执行计划:
如何添加索引来加速我的新查询?
最佳答案
首先您应该选择并使用索引列进行计数,这将根据性能更好地排序,然后您可以在过滤结果中加入艺术家姓名以完成您的数据。东西会喜欢。
SELECT ar2.name, t.c
FROM
(
SELECT ar.artist_id, COUNT(*) c
FROM artist ar
JOIN album al ON ar.artist_id=al.artist_id
GROUP BY ar.artist_id
ORDER BY 2 DESC
LIMIT 10
)
t JOIN artist ar2 ON ar2.artist_id=t.artist_id
我尝试使用您的数据,用时不到 1 秒。希望这有帮助
关于mysql - 在 SQL 中,如何使用索引来加速此数据库查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20602030/