2010-11-18 17 views
0

Je profile une application web, en essayant de réduire les retards inutiles sur les requêtes et j'en ai trouvé un qui semble être simple, mais prendre beaucoup de temps pour l'exécution.Coincé avec optimisation sur MySql, en utilisant temporaire, en utilisant le tri de fichiers ... messages sur EXPLAIN

En utilisant EXPLIQUER je reçois les messages suivants:

Using where; Using temporary; Using filesort 

C'est la requête:

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

Et la définition de table:

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; 

je tente de résoudre la création d'index pour chaque domaine impliqué sans résultat.

Une idée avec ça?

Merci à l'avance

Répondre

0

Avec un bon INDEX, MySQL peut très bien trier vos résultats correctement sans la déclaration ORDER BY. Vous voudrez regarder dans ORDER BY Optimization et LIMIT Optimization. Dans le cas contraire, l'utilisation temporaire et filesort provient d'un GROUP BY et d'un ORDER BY différents. Pour cette requête particulière, je supprimerais les indices que vous avez mis en place et ajouter celui-ci:

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

Bien sûr, cela peut affecter d'autres questions tout au long de votre projet. Une fois cela fait, changer votre requête:

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` 

Se rendant compte que vous voudrez peut-être pas un groupe par nom, vous pouvez supprimer le nom du GROUP BY, mais cela vous donnera using temporary à nouveau (puisque le groupe et ORDER sont différents).

+0

Merci pour votre réponse! Cela ouvre de nouvelles voies à la solution. La chose est que j'essaie de trier par nom, et dans cet exemple, l'ordre est fait par id_brand en premier. –

0

s'il vous plaît consulter à l'adresse suivante ...

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; 

pourquoi cite: quand vous ne devez et trier vos types de données pls.