簡體   English   中英

將MBRContains()等同為TRUE時,MySQL空間索引不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM