gpt4 book ai didi

将 MBRContains() 等同于 TRUE 时,MySQL 空间索引不起作用?

转载 作者:可可西里 更新时间:2023-11-01 07:45:35 24 4
gpt4 key购买 nike

我有一个 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() 独立,空间索引就会得到正确使用。

我的问题是:为什么会这样,即使我在 的末尾写了 =true ,我也能做些什么来启用空间索引吗? WHERE 子句?

我在其中设置 =true 的唯一原因是因为我正在使用 CodeIgniter 的 Active Record 并且看不到一个简单的解决方法(所以如果你知道绕过它,这是解决我的问题的另一种方法。(即使切换到仅使用 $this->db->query() 也会涉及很多工作。) p>

我的表是这样的:

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 and MySQL spatial index

我所做的只是在我们应用程序的 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 ...

关于将 MBRContains() 等同于 TRUE 时,MySQL 空间索引不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3894994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com