2011-11-17 46 views
3

我有一個115MByte,存儲房價和座標1,600,000行的表。 'SELECT'查詢耗時太長。我想知道是否有人可以提出一種加速的方法。Optomizing MySQL的 - WHERE和ORDER BY使用不同的列

稍作簡化我的表的版本....

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英里×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秒內運行 - 更快,但我真的很喜歡它還要更快。

查詢將通過一個網站有多個用戶運行。所有查詢都是相似的,但經緯度和價格有不同的範圍。表寫速度並不重要。

任何人都可以建議如何加快查詢?或者至少鼓勵MySQL使用索引'lat',當其更好的選擇時(我寧願不使用'force lat',因爲我發現查詢從更大的區域提取更適合使用'價格'索引)。

我已經運行 '分析' 和 'OPTOMIZE'。

我已經閱讀了MySQL索引的命令 - 其中相同的索引可以用於'WHERE'和'ORDER BY'子句,但我不認爲這可以用於WHERE是範圍的地方嗎?

是否值得追求的「空間索引」?

任何想法表示歡迎,因爲我真的需要得到這個快得多。

回答

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 
+0

感謝@Francisco索托。運行時間= 0.11s + 0.001s。我也嘗試將「WHERE價格」部分移到第二個查詢中 - 得到相同的結果。我想知道是否有任何方法可以加速第一個查詢 - 我將嘗試進一步分解。 – spiderplant0

+0

另外,爲什麼你有一個在緯度的指數,但不是在經度? –

+0

因爲它一次只能使用一個索引,而經度和緯度應該與數據相當對稱,所以我想我會通過不給它一個選擇來決定哪個索引更容易使用。試過INDEX(lat,lng),但似乎並沒有加快速度。 – spiderplant0