我迫切需要一些东西来加速这个查询!
这是查询,如何添加索引以加快速度,以及如何更改以使查询更快?
这是在phpmyadmin中执行的实际查询。
显示0到6行(总计7行,查询耗时6.4767秒)
这是相同的查询,但我使用UNION ALL来显示所有结果:
显示0到29行(总计23074,查询耗时4.0590秒)
SELECT `location2` as `location`, '2' as `number`
FROM `properties`
WHERE `price_from` BETWEEN 0 AND 999999
AND `country` = 'spain'
union
SELECT `location3` as `location`, '3' as `number`
FROM `properties`
WHERE `price_from` BETWEEN 0 AND 999999
AND `location2` = 'spain'
union
SELECT `location4` as `location`, '4' as `number`
FROM `properties`
WHERE `price_from` BETWEEN 0 AND 999999
AND `location3` = 'spain'
union
SELECT `location5` as `location`, '5' as `number`
FROM `properties`
WHERE `price_from` BETWEEN 0 AND 999999 AND
`location4` = 'spain'
union
SELECT `location6` as `location`, '6' as `number`
FROM `properties`
WHERE `price_from` BETWEEN 0 AND 999999
AND `location5` = 'spain'
答案 0 :(得分:1)
提高性能的最快方法是向国家/地区添加索引。建立这个的更好方法是在国家/地区列上添加一个整数查找ID,方法是添加另一个国家/地区表(country_id,country),然后更改国家/地区='西班牙'到country_id = 1
答案 1 :(得分:0)
如果可能,请考虑将UNION替换为UNION ALL,因为UNION会对其进行排序并执行重复数据删除。
答案 2 :(得分:0)
INDEX(country, price_from, location2),
INDEX(location2, price_from, location3),
...
这些索引可以加快速度,不仅可以使WHERE
更快,还可以“覆盖”。 不在索引中使用“前缀”(如Kev建议的那样);它不会起作用。如果你的位置大于(100),他们到底是什么?没有“国家”在任何大的地方都有名称。
请提供SHOW CREATE TABLE
,以便我们解释为什么不将一系列位置实现为列,而是有一个单独的表。
一旦你有了单独的表,UNIONs
就会消失,查询变得更简单,更快。