count和order-by性能非常慢

pxiryf3j  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(1060)

以下查询的平均持续时间为10秒:

  1. SELECT masters_genres.*, masters_artists.*,
  2. COUNT(masters_artists.master_id) as quantity FROM masters_genres
  3. JOIN masters_artists ON masters_genres.master_id = masters_artists.master_id
  4. WHERE masters_genres.genre='Electronic' GROUP BY masters_artists.artist_id
  5. ORDER BY quantity DESC LIMIT 25

这些表有200万和300万条记录。
表结构:

  1. -- -----------------------------------------------------
  2. -- Table `music_data`.`masters_artists`
  3. -- -----------------------------------------------------
  4. CREATE TABLE IF NOT EXISTS `music_data`.`masters_artists` (
  5. `master_id` INT(30) NOT NULL,
  6. `artist_id` INT(30) NOT NULL,
  7. `artist_name` VARCHAR(500) CHARACTER SET 'utf8' NOT NULL,
  8. INDEX `artist_id` (`artist_id` ASC),
  9. INDEX `fk_masters_artists_masters_idx` (`master_id` ASC),
  10. CONSTRAINT `fk_masters_artists_masters`
  11. FOREIGN KEY (`master_id`)
  12. REFERENCES `music_data`.`masters` (`master_id`)
  13. ON DELETE NO ACTION
  14. ON UPDATE NO ACTION)
  15. ENGINE = InnoDB
  16. DEFAULT CHARACTER SET = latin1;
  17. -- -----------------------------------------------------
  18. -- Table `music_data`.`masters_genres`
  19. -- -----------------------------------------------------
  20. CREATE TABLE IF NOT EXISTS `music_data`.`masters_genres` (
  21. `master_id` INT(30) NOT NULL,
  22. `genre` VARCHAR(255) CHARACTER SET 'utf8' NOT NULL,
  23. INDEX `genre` (`genre` ASC),
  24. INDEX `fk_masters_genres_masters1_idx` (`master_id` ASC),
  25. CONSTRAINT `fk_masters_genres_masters1`
  26. FOREIGN KEY (`master_id`)
  27. REFERENCES `music_data`.`masters` (`master_id`)
  28. ON DELETE NO ACTION
  29. ON UPDATE NO ACTION)
  30. ENGINE = InnoDB
  31. DEFAULT CHARACTER SET = latin1;

如何加快查询速度?我知道速度下降是因为。。。

  1. ORDER BY quantity DESC

但我不知道如何改进我的查询以得到正确的结果。

y0u0uwnf

y0u0uwnf1#

我尝试了另一个解决方案并生成了一个helper表。我发现为综合指数找到正确的顺序是非常重要的:1。位置应该是“分组依据”列,在我的例子中是艺术家id 2。position应该是我用于“count”的列,这里是master\u id,然后是where子句。
一开始我对索引使用了相同的列组合,但是速度慢了很多。现在我能在1秒后得到结果,与前10秒相比,这是一个极好的性能提升。

相关问题