mysql - 在 SQL 中,如何使用索引来加速此数据库查询?

标签 mysql sql

我有两个表:

enter image description here

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秒,太慢了。

执行计划: enter image description here

如何添加索引来加速我的新查询?

示例数据: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 秒。希望这有帮助

关于mysql - 在 SQL 中,如何使用索引来加速此数据库查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20602030/

相关文章:

c# - 命令执行mysql数据插入时遇到 fatal error

MySQL 在 2 次更新时死锁

sql - 将日期与 Oracle 中的 current_date 进行比较

Sql Server 按特定顺序显示项目

mysql - 将 SQL 表 header value 与另一个表列值匹配

MySQL - 计算行数和左连接问题

MySQL 错误 1406 (22001) : Data too long for column

mysql - #1054 - 字段列表中的未知列

MySQL选择排除总和等于0的列的表

sql - 如果传递 null 将引发错误的 TSQL 函数?