MySQL - COUNT 和 ORDER BY 性能在大型表上非常慢
MySQL - COUNT and ORDER BY performance is very slow on large tables
以下查询的平均持续时间为 10 秒:
SELECT masters_genres.*, masters_artists.*,
COUNT(masters_artists.master_id) as quantity FROM masters_genres
JOIN masters_artists ON masters_genres.master_id = masters_artists.master_id
WHERE masters_genres.genre='Electronic' GROUP BY masters_artists.artist_id
ORDER BY quantity DESC LIMIT 25
表有 2 和 300 万条记录。
Table结构:
-- -----------------------------------------------------
-- Table `music_data`.`masters_artists`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `music_data`.`masters_artists` (
`master_id` INT(30) NOT NULL,
`artist_id` INT(30) NOT NULL,
`artist_name` VARCHAR(500) CHARACTER SET 'utf8' NOT NULL,
INDEX `artist_id` (`artist_id` ASC),
INDEX `fk_masters_artists_masters_idx` (`master_id` ASC),
CONSTRAINT `fk_masters_artists_masters`
FOREIGN KEY (`master_id`)
REFERENCES `music_data`.`masters` (`master_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
-- -----------------------------------------------------
-- Table `music_data`.`masters_genres`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `music_data`.`masters_genres` (
`master_id` INT(30) NOT NULL,
`genre` VARCHAR(255) CHARACTER SET 'utf8' NOT NULL,
INDEX `genre` (`genre` ASC),
INDEX `fk_masters_genres_masters1_idx` (`master_id` ASC),
CONSTRAINT `fk_masters_genres_masters1`
FOREIGN KEY (`master_id`)
REFERENCES `music_data`.`masters` (`master_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
我可以做些什么来加快这个查询?
我知道速度正在下降,因为...
ORDER BY quantity DESC
但我不知道如何改进我的查询以获得正确的结果。
我尝试了另一种解决方案并生成了一个助手 table。我发现找到复合索引的正确顺序非常重要:
1. 位置应该是 "group by" 列,在我的例子中是 artist_id
2.position应该是我用的那一栏"count",这里是master_id
然后是 WHERE 子句。
一开始我对索引使用了相同的列组合,但是速度慢了很多。现在我可以在 1 秒后得到结果,与之前的 10 秒相比,性能提升非常好。
以下查询的平均持续时间为 10 秒:
SELECT masters_genres.*, masters_artists.*,
COUNT(masters_artists.master_id) as quantity FROM masters_genres
JOIN masters_artists ON masters_genres.master_id = masters_artists.master_id
WHERE masters_genres.genre='Electronic' GROUP BY masters_artists.artist_id
ORDER BY quantity DESC LIMIT 25
表有 2 和 300 万条记录。
Table结构:
-- -----------------------------------------------------
-- Table `music_data`.`masters_artists`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `music_data`.`masters_artists` (
`master_id` INT(30) NOT NULL,
`artist_id` INT(30) NOT NULL,
`artist_name` VARCHAR(500) CHARACTER SET 'utf8' NOT NULL,
INDEX `artist_id` (`artist_id` ASC),
INDEX `fk_masters_artists_masters_idx` (`master_id` ASC),
CONSTRAINT `fk_masters_artists_masters`
FOREIGN KEY (`master_id`)
REFERENCES `music_data`.`masters` (`master_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
-- -----------------------------------------------------
-- Table `music_data`.`masters_genres`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `music_data`.`masters_genres` (
`master_id` INT(30) NOT NULL,
`genre` VARCHAR(255) CHARACTER SET 'utf8' NOT NULL,
INDEX `genre` (`genre` ASC),
INDEX `fk_masters_genres_masters1_idx` (`master_id` ASC),
CONSTRAINT `fk_masters_genres_masters1`
FOREIGN KEY (`master_id`)
REFERENCES `music_data`.`masters` (`master_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
我可以做些什么来加快这个查询? 我知道速度正在下降,因为...
ORDER BY quantity DESC
但我不知道如何改进我的查询以获得正确的结果。
我尝试了另一种解决方案并生成了一个助手 table。我发现找到复合索引的正确顺序非常重要: 1. 位置应该是 "group by" 列,在我的例子中是 artist_id 2.position应该是我用的那一栏"count",这里是master_id 然后是 WHERE 子句。
一开始我对索引使用了相同的列组合,但是速度慢了很多。现在我可以在 1 秒后得到结果,与之前的 10 秒相比,性能提升非常好。