我有一个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>
值得追求'空间指数'吗?
欢迎任何想法,因为我真的需要更快地获得这些想法。
答案 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