我正在使用这种具有不同参数的查询:
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
这就是我在解释部分得到的内容:
这些是我已经尝试使用的索引:
任何帮助都会深深体会到哪种索引是最佳选择,还是应该使用其他表结构?
答案 0 :(得分: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然后查看过滤器针对C的剩余值。在这种情况下,该过滤器通过文件排序执行。
可能的解决方案
另一个提示
如果我误解了你的问题(当我没有你的系统进行测试时很容易做到),这里重要的是解决问题的方法。特别是,如何将复杂的查询分解为产生相同行为的更简单的查询,直到您获得演示该问题的非常简单的SELECT语句。在这一点上,答案通常更加清晰。