簡體   English   中英

如何避免對該MySQL查詢進行文件排序?

[英]How to avoid filesort for that mysql query?

我正在使用具有不同參數的這種查詢:

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 

這就是我在解釋部分中得到的:

說明

這些是我已經嘗試使用的索引:

指標

任何幫助將不勝感激,哪種索引將是最佳選擇,還是我應該使用其他表結構?

您應該首先簡化查詢以更好地了解問題。 看來您的問題僅限於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->硬粒木-> 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. 在不需要'mahelle'的'ilan_gene1'上添加新索引,即A-> C-> D ...

另一個提示

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM