2012-01-01 65 views
0

我使用这种具有不同参数的查询:如何避免该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,然后在A上查找过滤器剩余的值与C相对应。在这种情况下,该过滤器通过文件排序来执行。

可能的解决方案

  1. 供应在您的查询 'mahelle'(B)。
  2. 添加一个新的指数 'ilan_gene1' 不需要 'mahelle',即A-> C-> d ...

另一个技巧

万一我有误诊你的问题(当我没有你的系统测试时很容易做到),这里最重要的是解决问题的方法。特别是,如何将一个复杂的查询分解为一个更简单的查询,以产生相同的行为,直到您找到一个非常简单的SELECT语句来演示问题。在这一点上,答案通常要清晰得多。

+0

感谢您的解释,但您不觉得“deneme”索引应掩盖您对可能的解决方案所说的话吗?但MySQL引擎不选择“deneme”索引或我误会? – motto 2012-01-01 22:23:28

+0

您是否使用建议的简单查询获得相同的行为? – 2012-01-01 22:33:33

+0

通过说更简单的查询你是否提到删除连接? – motto 2012-01-01 22:35:37