【问题标题】:MySQL - COUNT and ORDER BY performance is very slow on large tablesMySQL - 大型表上的 COUNT 和 ORDER BY 性能非常慢
【发布时间】:2018-05-03 03:31:24
【问题描述】:

以下查询的平均持续时间为 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 和 3 百万条记录。

表结构:

-- -----------------------------------------------------
-- 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

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

【问题讨论】:

    标签: mysql sql-order-by innodb limit


    【解决方案1】:

    我尝试了另一种解决方案并生成了一个帮助表。我发现为复合索引找到正确的顺序非常重要: 1.位置应该是“分组依据”列,在我的例子中是artist_id 2. position应该是我用于“计数”的列,这里是master_id 然后是 WHERE 子句。

    一开始我使用相同的列组合作为索引,但速度要慢得多。现在我可以在 1 秒后得到结果,与之前的 10 秒相比,性能有了惊人的提升。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 2023-02-01
      • 2019-08-21
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多