我如何加快mysql查询速度

时间:2016-01-14 20:13:00

标签: mysql performance

我迫切需要一些东西来加速这个查询!

这是查询,如何添加索引以加快速度,以及如何更改以使查询更快?

这是在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' 

3 个答案:

答案 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就会消失,查询变得更简单,更快。