我有一个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 ;
感谢您的帮助!
listings2
(id
int(11) NOT NULL AUTO_INCREMENT,title
varchar(255) NOT NULL DEFAULT '',latitude
decimal(10,6) NOT NULL,longitude
decimal(1 ... 等等的内容。 - user4951