2011-05-05 52 views
3

我的表目前維持這樣的:如何將此MySQL表與INDO數據一起使用?

CREATE TABLE IF NOT EXISTS `x_geodata` (
    `post_id` int(11) NOT NULL, 
    `post_type` varchar(20) NOT NULL, 
    `lat` float(10,6) NOT NULL, 
    `lng` float(10,6) NOT NULL, 
    PRIMARY KEY (`post_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

我如何正確有效地INDEX這個表?

唯一的查詢在此表上跑如下:

if(!empty($_SESSION['s_property_radius'])) {$dist = $_SESSION['s_property_radius'];}else{$dist = 50;} 
$orig_lat = $_SESSION['s_property_address_lat']; 
$orig_lon = $_SESSION['s_property_address_lng']; 
$lon1 = $orig_lon - $dist/abs(cos(deg2rad($orig_lat)) * 69); 
$lon2 = $orig_lon + $dist/abs(cos(deg2rad($orig_lat)) * 69); 
$lat1 = $orig_lat - ($dist/69); 
$lat2 = $orig_lat + ($dist/69); 


$sql = " 

SELECT `t`.`post_id`, 3956 * 2 * ASIN(SQRT(POWER(SIN((".$orig_lat." - `t`.`lat`) * pi()/180/2), 2) + COS(".$orig_lat." * pi()/180) * COS(`t`.`lat` * pi()/180) * POWER(SIN((".$orig_lon." - `t`.`lng`) * pi()/180/2), 2))) AS `distance` FROM (
    SELECT `post_id`, `lat`, `lng` FROM `x_geodata` WHERE `post_type` = 'some post type' AND `lng` BETWEEN '".$lon1."' AND '".$lon2."' AND `lat` BETWEEN '".$lat1."' AND '".$lat2."' 
) AS `t` HAVING `distance` <= ".$dist." 

"; 

查詢檢查,以確保我們正在尋找正確的職位類型,然後做的緯度和經度方半徑檢查。然後返回的結果通過循環半徑檢查運行。

我在找的是更新CREATE TABLE SQL或UPDATE TABLE SQL以正確地得到這個INDEXED。

任何幫助,非常感謝。

編輯: 難道基於arnep回答我的查詢的解釋,我得到了這一點:

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 
2 DERIVED zch_geodatastore range post_type post_type 70 NULL 3 Using where 

不知道這意味着什麼,但...

+0

你的'EXPLAIN'包含兩個部分:一個是外部選擇,第二個是內部選擇。內部select使用你的新索引,通過使用你的'WHERE'子句,它返回3行。外層選擇使用這個「派生」表,沒有任何索引...但不用擔心:因爲它計算每行的一些東西,所以不需要索引。有關內部選擇的更多信息,您可以在其上執行另一個「EXPLAIN」。 btw:你的'CREATE TABLE'使用'lon',你的'SELECT'使用'lng' ......令人困惑。而你的內心選擇不會返回'lat'和'lng' ...缺少某些東西? – arnep 2011-05-18 09:55:00

+0

我已更新我的代碼。表應該不是lon。我在'lat'和'lng'中添加了內部查詢。當我發佈這些代碼時,不知道我是如何錯過它們的。 – Brady 2011-05-18 10:13:09

回答

1

正如你的內心SELECT使用post_typelatlonWHERE條款我建議把指數的那些。

使用EXPLAIN [QUERY]來查看索引是否被使用以及您從中獲得哪些好處。

+0

我該如何在這些上面加上索引?像這樣:'KEY post_type(post_type,lat,lng)'? – Brady 2011-05-17 14:41:21

+0

'ALTER TABLE x_geodata ADD INDEX new_index(post_type,lat,lng);'我推薦使用MySQL查詢瀏覽器或PHPMyAdmin等工具來創建索引等,並查看創建的SQL輸出。或者閱讀mysql.com :-) – arnep 2011-05-17 14:50:21

+0

使用了一個EXPLAIN。請參閱編輯問題。 – Brady 2011-05-17 15:17:16

2

MySQL已經得到了特殊SPATIAL鍵爲MySQL 。
見:http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html

而且從報價:http://dev.mysql.com/doc/refman/5.1/en/create-index.html

了MyISAM,InnoDB的,NDB和歸檔存儲引擎支持空間列,比如(點和幾何(11.17節,「空間擴展。 」,描述了空間數據類型)

空間鍵是:。
•僅可用於MyISAM表指定空間其他存儲引擎的INDEX導致錯誤。
•索引列必須爲NOT NULL。
•在MySQL 5.1中,禁止列前綴長度。每列的全部寬度都被編入索引。

您是否知道這是一個特殊的https://gis.stackexchange.com/這類問題的論壇,
我推薦你(雙)在那裏發佈你的問題。

+0

關於在GIS上發佈,你可以說http://dba.stackexchange.com/相同。畢竟這是一個數據庫問題。但是因爲這三者中有一部分我認爲在這裏發佈更合適。但是,如果管理員覺得需要移動這個帖子,那麼這樣做。 – Brady 2011-05-05 16:34:12

+0

我知道使用SPATIAL INDEX,但是對於我需要這張表格的簡單需求來說,這不是一點OTT嗎?另外我只會使用POINT。那麼,空間數據類型的開銷可能會過多,而且文本表示的所有轉換都是這樣? – Brady 2011-05-05 16:36:13

+2

@布雷迪,忠告!=批評 – Johan 2011-05-05 16:46:37

相關問題