[英]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.在这种情况下,该筛选器是通过文件排序执行的。
可能的解决方案
另一个提示
万一我误诊了您的问题(当我没有要测试的系统时,很容易做到),这里重要的是解决问题的方法。 特别是,如何将一个复杂的查询分解为一个产生相同行为的简单查询,直到获得一个非常简单的SELECT语句来演示该问题。 在这一点上,答案通常更加清晰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.