MySQL - производительность COUNT и ORDER BY на больших таблицах очень низкая - PullRequest
0 голосов
/ 03 мая 2018

Средняя продолжительность следующего запроса составляет 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

но я не знаю, как улучшить свой запрос, чтобы получить правильные результаты.

1 Ответ

0 голосов
/ 07 мая 2018

Я попробовал другое решение и сгенерировал вспомогательную таблицу. Я обнаружил, что очень важно найти правильный порядок для составного индекса: 1. позиция должна быть столбцом "group by", в моем случае artist_id 2. позиция должна быть столбцом, который я использовал для "count", здесь master_id Тогда предложение WHERE.

В начале я использовал ту же комбинацию столбцов для индекса, но это было намного медленнее. Теперь я могу получить результаты через 1 секунду, замечательное увеличение производительности по сравнению с 10 секундами ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...