Застрял с оптимизацией на MySql, используя временные, сортировки файлов ... сообщения на EXPLAIN

0

Я профилирую веб-приложение, пытаясь сократить ненужные задержки в запросах, и я нашел тот, который кажется простым, но занимает много времени для выполнения.

Использование EXPLAIN Я получаю следующие сообщения:

Using where; Using temporary; Using filesort

Это запрос:

SELECT `bt`.`id_brand`
FROM `brands_translation` AS `bt`
WHERE bt.code_language = 'es'
GROUP BY `bt`.`id_brand`
ORDER BY `bt`.`name` ASC

И определение таблицы:

CREATE TABLE IF NOT EXISTS `brands_translation` (
  `id_brand` int(64) unsigned NOT NULL,
  `code_language` varchar(3) NOT NULL,
  `name` varchar(128) NOT NULL,
  `link` varchar(255) default NULL,
  `logo` varchar(255) default NULL,
  `description` text NOT NULL,
  KEY `id_brand` (`id_brand`),
  KEY `code_language` (`code_language`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

Любая идея с этим?

Заранее спасибо

Теги:
optimization

2 ответа

0

При правильном INDEX MySQL может очень хорошо сортировать ваши результаты без инструкции ORDER BY. Вы хотите посмотреть ORDER BY Optimization и LIMIT Optimization.

В противном случае временное и файловое использование исходят от разных GROUP BY и ORDER BY. В этом конкретном запросе я удаляю индексы, которые у вас есть, и добавляю следующее:

ALTER TABLE  `brands_translation` ADD INDEX (`code_language` , `id_brand` , `name` );

Конечно, это может повлиять на другие запросы в вашем проекте. После этого измените свой запрос на:

SELECT `bt`.`id_brand`
FROM `brands_translation` AS `bt`
WHERE bt.code_language = 'es'
GROUP BY `bt`.`id_brand`, `bt`.`name`
ORDER BY `bt`.`id_brand`, `bt`.`name`

Понимая, что вы не хотите группировать по имени, вы можете удалить имя из оператора GROUP BY, но это снова даст вам using temporary (так как GROUP и ORDER отличаются).

  • 0
    Спасибо за ваш ответ! Это открывает новые пути к решению. Дело в том, что я пытаюсь отсортировать по имени, и в этом примере заказ сначала выполняется id_brand.
0

просмотрите следующее...

drop table if exists brands_translation;
create table brands_translation
(
code_language varchar(3) not null,
id_brand int unsigned not null,
-- other fields here...
primary key(code_language, id_brand) -- clustered composite primary key (please !!)
) 
engine=innodb;

зачем цитата "когда вам не нужно и сортировать свои типы данных".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню