2012-01-01 63 views
0

我使用這種具有不同參數的查詢:如何避免該mysql查詢的文件?

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行?

如果是這樣,你應該能夠看到發生了什麼。數據庫正在使用Hepsi索引,盡其所能,獲得3661行,然後對這些行進行排序,以便根據其他標準(即'durum','kategori','tip')消除值。

這裏的關鍵在於,如果按照A,B,C的順序對數據進行排序並且未指定B,那麼可以完成的最合理的事情是:首先查找A,然後在A上查找過濾器剩餘的值與C相對應。在這種情況下,該過濾器通過文件排序來執行。

可能的解決方案

  1. 供應在您的查詢 'mahelle'(B)。
  2. 添加一個新的指數 'ilan_gene1' 不需要 'mahelle',即A-> C-> d ...

另一個技巧

萬一我有誤診你的問題(當我沒有你的系統測試時很容易做到),這裏最重要的是解決問題的方法。特別是,如何將一個複雜的查詢分解爲一個更簡單的查詢,以產生相同的行爲,直到您找到一個非常簡單的SELECT語句來演示問題。在這一點上,答案通常要清晰得多。

+0

感謝您的解釋,但您不覺得「deneme」索引應掩蓋您對可能的解決方案所說的話嗎?但MySQL引擎不選擇「deneme」索引或我誤會? – motto 2012-01-01 22:23:28

+0

您是否使用建議的簡單查詢獲得相同的行爲? – 2012-01-01 22:33:33

+0

通過說更簡單的查詢你是否提到刪除連接? – motto 2012-01-01 22:35:37