Я профилирую веб-приложение, пытаясь сократить ненужные задержки в запросах, и я нашел тот, который кажется простым, но занимает много времени для выполнения.
Использование 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;
Я пытаюсь решить это, создавая индексы для каждого задействованного поля без результата.
Любая идея с этим?
Заранее спасибо
При правильном 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 отличаются).
просмотрите следующее...
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;
зачем цитата "когда вам не нужно и сортировать свои типы данных".