Как избежать сортировки файлов для этого запроса MySQL? - PullRequest
0 голосов
/ 02 января 2012

Я использую этот тип запросов с различными параметрами:

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

Буду признателен за любую помощь, какой индекс будет лучшим вариантом, или я должен использовать другую структуру таблицы?

1 Ответ

1 голос
/ 02 января 2012

Вы должны сначала упростить ваш запрос, чтобы лучше понять вашу проблему.Поскольку ваша проблема ограничена таблицей 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-> tip-> ozelik

Я написал это такспособ подчеркнуть, что сначала он сортируется по 'ilce', затем 'mahelle', затем 'durum' и т. д. Обратите внимание, что в вашем запросе не указано значение 'mahelle'.Таким образом, лучшее, что может сделать индекс - это поиск по «ilce».Теперь я не знаю эвристики ваших данных, но следующий логический шаг в отладке это будет:

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

Возвращает ли это 3661 строк?

Если это так, вы должны видеть, что происходит.База данных использует индекс Хепси, в меру своих возможностей, получая 3661 строку обратно, затем сортируя эти строки, чтобы исключить значения в соответствии с другими критериями (например, «durum», «kategori», «tip»).

Ключевым моментом здесь является то, что если данные отсортированы по A, B, C в указанном порядке, а B не указан, то лучшая логическая вещь, которую можно сделать, это: сначала посмотреть на A, затем выполнить фильтр наоставшиеся значения по отношению к C. В этом случае этот фильтр выполняется с помощью сортировки файлов.

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

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

Другойtip

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

...