我正在試圖對大約100萬條記錄的表執行查詢。 表與它的指標的結構是:MySQL查詢性能調優
CREATE TABLE `table` (
`Id` int(11) NOT NULL,
`Name` varchar(510) DEFAULT NULL,
`Latitude` float NOT NULL DEFAULT '0',
`Longitude` float NOT NULL DEFAULT '0',
PRIMARY KEY (`Latitude`,`Longitude`,`Id`),
KEY `IX_Latitude_Longitude` (`Latitude`,`Longitude`),
KEY `IX_Latitude` (`Latitude`),
KEY `IX_Longitude` (`Longitude`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我運行下面的查詢:
SELECT m.Id, m.Name, sqrt(69.1 * (m.Latitude - :latitude) * 69.1 * (m.Latitude - :latitude) +
53.0 * (m.longitude - :longitude) * 53.0 * (m.longitude - :longitude)) as Distance,
m.Latitude as Latitude, m.Longitude as Longitude
FROM table m
WHERE sqrt(69.1 * (m.Latitude - :latitude) * 69.1 * (m.Latitude - :latitude)
+ 53.0 * (m.longitude - :longitude) * 53.0 * (m.longitude - :longitude)) < :radius
ORDER BY sqrt(69.1 * (m.Latitude - :latitude) * 69.1 * (m.Latitude - :latitude) +
53.0 * (m.longitude - :longitude) * 53.0 * (m.longitude - :longitude)) desc
LIMIT 0, 100
那想返回特定範圍的所有記錄(距離計算的信息:http://www.meridianworlddata.com/Distance-Calculation.asp )
但查詢需要花費大量的時間... 這裏是解釋計劃,我得到:
id|select_type |table|type|possible_keys|key |key_len|ref |rows |Extra
1 |SIMPLE |m |ALL |{null} |{null}|{null} |{null}|1264001|Using where; Using filesort
我在做什麼錯? 我需要添加哪個索引才能使查詢使用它來代替表掃描? 我是否需要更改表格結構?
@GEOCHET,你爲什麼要添加那些不需要的反引號? – 2011-03-30 21:43:30
@nhnb:我沒有。 – GEOCHET 2011-03-30 21:48:45
你在那張桌子上有足夠的索引嗎?至少有2個是多餘的,所以你可以刪除它們:IX_Latitude_Longitude和IX_Latitude – 2011-03-30 22:03:57