优化MySQL - WHERE和ORDER BY使用不同的列

时间:2011-11-17 19:18:59

标签: mysql query-optimization sql-order-by

我有一个115MByte,1,600,000行表,用于存储房价和坐标。 'SELECT'查询花了太长时间。我想知道是否有人可以提出一种加快速度的方法。

我桌子的略微简化版......

CREATE TABLE `prices1` (
    `price` INT(10) NOT NULL,
    `address` VARCHAR(127) NOT NULL,
    `lat` FLOAT(6,4) NOT NULL COMMENT 'GPS latitude',
    `lng` FLOAT(6,4) NOT NULL COMMENT 'GPS longitude',
    INDEX `lat` (`lat`),
    INDEX `price` (`price`)
) ENGINE=MyISAM ROW_FORMAT=DEFAULT

此查询提取2英里x 2英里方形区域内的记录....

SELECT * FROM prices1
WHERE lat >= 55.9430 AND lat <= 55.9641
AND lng >= -3.2279 AND lng <= -3.1901                 
AND price >= 100000 and price <= 400000
ORDER BY price asc
LIMIT 50

......需要0.8秒。 EXPLAIN表示正在使用索引“价格”。

如果我使用force index(lat),查询会在0.1秒内运行 - 速度要快得多,但我还是更喜欢它。

查询将通过具有多个用户的网站运行。所有查询都类似,但lat,lng和price的范围不同。表写入速度并不重要。

有人可以建议我如何加快查询速度吗?或者至少鼓励MySQL使用索引'lat'作为更好的选择(我宁愿不使用'force lat',因为我发现使用'price'索引可以更好地运行从更大区域提取的查询)。 p>

我跑'分析'和'OPTOMIZE'。

我已经通过索引来读取MySQL的顺序' - 其中相同的索引可以用于'WHERE'和'ORDER BY'子句但是我不认为这可以在WHERE是一个范围的地方使用? / p>

值得追求'空间指数'吗?

欢迎任何想法,因为我真的需要更快地获得这些想法。

1 个答案:

答案 0 :(得分:1)

如果您这样做会发生什么:

INSERT INTO temporal
SELECT * FROM prices1
WHERE lat >= 55.9430 AND lat <= 55.9641
AND lng >= -3.2279 AND lng <= -3.1901                 
AND price >= 100000 and price <= 400000



SELECT * from temporal
ORDER BY price asc
LIMIT 50