2010-11-18 3 views
0

Webアプリケーションをプロファイリングして、不要な遅延を削減しようとしましたが、実行のための多くの時間。MySqlの最適化に悩まされ、ファイルソートを使用して一時的に使用しています。EXPLAINのメッセージ

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; 

私はインデックスを作成、それを解決しようとする。これは、クエリで

Using where; Using temporary; Using filesort 

使用して、私は次のメッセージを取得するEXPLAIN結果のない関連するすべてのフィールドについて

これは何ですか?適切なINDEXで事前

答えて

0

おかげで、MySQLは非常によくORDER BY書なしで適切に検索結果をソートすることができます。あなたはORDER BY OptimizationLIMIT Optimizationを調べたいと思うでしょう。

それ以外の場合、一時的なファイルとファイルの使用は、異なるGROUP BYとORDER BYのものです。この特定のクエリのために、私はあなたの場所に持っているインデックスを削除して、この1を追加します。もちろん

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ステートメントから名前を削除することができますが、それはGROUPとORDERので、(あなたusing temporaryもう一度与えます異なっています)。

+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; 

なぜ引用 `あなたがする必要があり、あなたのデータ型のplsを整理いけないをご覧ください。

関連する問題