繁体   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