2012-01-01 3 views
0

Я использую этот вид запросов с различными параметрами:Как избежать filesort для этого запроса 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, затем фильтр на остальные значения против C. В этом случае этот фильтр выполняется через сортировку файла.

Возможные решения

  1. Поставка 'mahelle' (B) в запросе.
  2. Добавить новый индекс на 'ilan_gene1', который не требует 'mahelle', т.е. A-> C-> D ...

Другой наконечник

В случае, если я диагностируется ваша проблема (легко сделать, когда у меня нет вашей системы для тестирования), здесь важно подходить к решению проблемы. В частности, как разбить сложный запрос на более простой запрос, который производит такое же поведение, пока вы не получите очень простой оператор SELECT, который демонстрирует проблему. На данный момент ответ, как правило, намного яснее.

+0

спасибо за объяснение, но разве вы не думаете, что индекс «deneme» должен скрывать то, что вы сказали о возможных решениях? но движок mysql не выбирает индекс «deneme» или я ошибаюсь? – motto

+0

Получаете ли вы такое же поведение с более простым запросом, как предложено? –

+0

, говоря проще, вы упоминаете удаление соединений? – motto

Смежные вопросы