[英]MySQL spatial index doesn't work when equating MBRContains() to TRUE?
我有一個SQL查詢,似乎產生了正確的結果,但根據EXPLAIN
不使用空間索引,所以需要比返回所有行所需的時間長得多。
SELECT * FROM listings2
WHERE MBRContains( GeomFromText('POLYGON((32.653132834095 -117.40548330929, 32.653132834095 -117.06151669071, 32.942267165905 -117.06151669071,32.942267165905 -117.40548330929,32.653132834095 -117.40548330929) )') ,geoPoint)=true
有趣的是,我發現如果我刪除=true
並讓MBRContains()
獨立,空間索引就會被正確使用。
我的問題是:為什么會出現這種情況,即使我在WHERE
子句的末尾寫了=true
,我能做些什么來使空間索引能夠工作嗎?
我在那里唯一的原因是=true
因為我正在使用CodeIgniter的Active Record並且看不到它的簡單方法(所以如果你知道解決它的方法,這是解決我問題的另一種方法)。 (即使切換到只使用$this->db->query()
也會涉及很多工作。)
我的桌子是這樣的:
CREATE TABLE IF NOT EXISTS `listings2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '',
`latitude` decimal(10,6) NOT NULL,
`longitude` decimal(10,6) NOT NULL,
`geoPoint` point NOT NULL,
PRIMARY KEY (`id`),
KEY `latitude` (`latitude`),
KEY `longitude` (`longitude`),
SPATIAL KEY `geoPoint` (`geoPoint`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=404838 ;
謝謝您的幫助!
我在hibernate中編寫查詢時遇到了類似的問題。 以下是我如何解決它: Hibernate和MySQL空間索引
我所做的就是在我們的應用程序的MySQLDialect中注冊一個帶有一點點黑客的新函數:
registerFunction("mbr_contains", new SQLFunctionTemplate(Hibernate.BOOLEAN, "MBRContains(?1, ?2) and 1"));
然后我在HQL查詢中使用了這個函數。 查詢現在變成這樣:
... and mbr_contains(GeomFromText(:${boundaryVariable}), location) = 1 ...
這是有效的HQL,並且還生成使用空間索引的SQL:
... and MBRContains(GeomFromText(?), location) and 1 = 1 ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.