[英]In SQL how can I use an index to speed up this database query?
我有兩張桌子:
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秒,這太慢了。
執行計划:
如何添加索引以加快我的新查詢?
樣本數據: http : //bit.ly/1k5ROrT
首先,您應該使用索引列進行選擇和計數,這將按性能進行更好的排序,然后您可以在篩選結果上加入藝術家名稱以完成數據。 有點像。
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秒。 希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.