Order By в запросе делает его медленнее - PullRequest
0 голосов
/ 12 марта 2020

У меня есть схема таблицы, как показано ниже:

CREATE TABLE IF NOT EXISTS `tbl_name` (
  `id` bigint(20) NOT NULL,
  `uid` int(11) NOT NULL COMMENT '101',
  `column1` int(11) NOT NULL COMMENT 'aaa',
  `column2` tinyint(4) NOT NULL COMMENT '0=a 1=b 2=c 3=d 5=e 6=f-f 7=g-g',
  `vergrund` int(11) NOT NULL COMMENT '103',
  `column2` varchar(4) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '108',
  `land` varchar(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '109',
  `column2` varchar(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '110',
  `marke` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '111',
  `modell` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '112',
  `market` int(11) NOT NULL COMMENT '125',
  `picture_status` int(11) NOT NULL,
  `update_status` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `uid` (`uid`),
  KEY `id` (`id`),
  KEY `marke` (`marke`),
  KEY `modell` (`marke`,`modell`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Эта таблица имеет данные около 500K. Я пытаюсь выполнить простой запрос, как показано ниже:

SELECT DISTINCT marke, 
                modell, 
                column1, 
                column2, 
                column3, 
                column4, 
                land, 
                column5, 
                plattform, 
                id 
FROM   tbl_name 
WHERE  vergrund IN ( "...." ) 
       AND picture_status >= 1 
       AND update_status = 0 
ORDER  BY marke, 
          modell 

Когда я выполняю этот запрос без заказа, он занимает около 8 секунд. Но когда я добавляю заказ, это занимает много времени, около 25 секунд. У меня есть Marke и Modell в качестве ключа тоже.

Может ли кто-нибудь помочь мне, как я могу ускорить этот запрос.

1 Ответ

0 голосов
/ 12 марта 2020

Вы выбираете первичный ключ, поэтому select distinct не требуется. Это должно помочь:

SELECT marke, modell, column1, column2, column3, column4, 
       land, column5, plattform, id 
FROM  tbl_name 
WHERE vergrund IN ( "...." ) AND
      picture_status >= 1 AND
      update_status = 0 
ORDER BY marke, modell ;

Я не знаю, достаточно ли умен MySQL, чтобы использовать индекс для сортировки, но это должно немного помочь.

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