2012-01-01 4 views
0

私は別のパラメータを持つクエリのこの種の使用しています:mysqlクエリのfilesortを避けるには?

EXPLAIN SELECT SQL_NO_CACHE `ilan_genel`.`id` , `ilan_genel`.`durum` , `ilan_genel`.`kategori` , `ilan_genel`.`tip` , `ilan_genel`.`ozellik` , `ilan_genel`.`m2` , `ilan_genel`.`fiyat` , `ilan_genel`.`baslik` , `ilan_genel`.`ilce` , `ilan_genel`.`parabirimi` , `ilan_genel`.`tarih` , `kgsim_mahalleler`.`isim` AS mahalle, `kgsim_ilceler`.`isim` AS ilce, (

SELECT `ilanresimler`.`resimlink` 
FROM `ilanresimler` 
WHERE `ilanresimler`.`ilanid` = `ilan_genel`.`id` 
LIMIT 1 
) AS resim 
FROM (
`ilan_genel` 
) 
LEFT JOIN `kgsim_ilceler` ON `kgsim_ilceler`.`id` = `ilan_genel`.`ilce` 
LEFT JOIN `kgsim_mahalleler` ON `kgsim_mahalleler`.`id` = `ilan_genel`.`mahalle` 
WHERE `ilan_genel`.`ilce` = '703' 
AND `ilan_genel`.`durum` = '1' 
AND `ilan_genel`.`kategori` = '1' 
AND `ilan_genel`.`tip` = '9' 
ORDER BY `ilan_genel`.`id` DESC 
LIMIT 225 , 15 

を、これは私がセクションの説明で得るものです:

explain

は、これらは私がすでに使用しようとしたインデックスです:

indexes

任意の助けは深くappreciaになりますどのようなインデックスが最適なオプションになるか、別のテーブル構造を使用する必要がありますか?

答えて

1

まず、問題をよりよく理解するためにクエリを単純化する必要があります。それはあなたの問題がilan_gen1テーブルに拘束されて表示される、次のクエリはまた、あなたと同じ症状を示すだろう。:

SELECT * from ilan_gene1 WHERE `ilan_genel`.`ilce` = '703' 
AND `ilan_genel`.`durum` = '1' 
AND `ilan_genel`.`kategori` = '1' 
AND `ilan_genel`.`tip` = '9' 

だから、まず最初に行うには、これが事実であることを確認しています。もしそうなら、より簡単な質問は、このクエリが3661行のファイルソートを必要とする理由だけです。今、「hepsi」インデックスのソート順は次のとおりです。

ilce-> mahelle-> durum-> kategori->ヒント - > ozelik私はそれを、それが最初にソートされていることを強調するために、そのように書いている

'ilce'、次に 'mahelle'、そして 'durum'など。クエリに 'mahelle'値が指定されていないことに注意してください。だから、インデックスは「ilce」のルックアップで可能です。今私はあなたのデータのヒューリスティックを知りませんが、これをデバッグでは次の論理的なステップは次のようになります。

SELECT * from ilan_gene1 WHERE `ilan_genel`.`ilce` = '703'` 

は、このリターン3661行をしていますか?

もしそうなら、何が起きているのかを知ることができます。データベースは、他の基準(すなわち、 'durum'、 'kategori'、 'tip')に基づいて値を削除するために、3661行を戻してそれらの行をソートすることで、最高の能力を持つ脈絡指数を使用しています。

データがA、B、Cの順にソートされ、Bが指定されていない場合、実行できる最もよい論理的なことは、まずAをルックアップし、次にこの場合、そのフィルタはファイルの並べ替えを介して実行されます。クエリで

可能な解決策

  1. サプライ 'mahelle'(B)。
  2. は 'mahelle' 必要としない 'ilan_gene1' に新しいインデックスを追加します。すなわちA-> C-> D ...

私が誤診されている場合にはもう一つのヒント

あなたの問題(私はあなたのシステムをテストする必要がないときに簡単に)、ここで重要なのは問題を解決するアプローチです。特に、複雑な問合せを、単純な問合せに分割して、同じ動作を生成する方法。問題を示す非常に単純なSELECT文になるまで。この時点で、答えは通常ははるかに明確です。

+0

説明に感謝しますが、あなたは可能な解決策についてあなたが言ったことを "deneme"インデックスでカバーしてはいけないと思いませんか? mysqlエンジンは "deneme"インデックスを選択しないか、間違っていますか? – motto

+0

提案したより簡単なクエリで同じ動作をしますか? –

+0

あなたは結合を削除することについて言及していますか? – motto

関連する問題