我在MariaDB 10.3数据库中有2个表。
注意:为了不扭曲结果,所有查询都是在MariaDB服务器上关闭查询缓存的情况下完成的。
我正在尝试执行此SQL查询-到目前为止,对于最后25条记录(排序是通过主键完成的,因此可以立即工作并且不会成为瓶颈):
SELECT Places.Id, Cities.Name
FROM Places
LEFT JOIN Cities ON ST_CONTAINS(Cities.Boundaries, POINT(Places.Lat, Places.Lon)))
ORDER BY Places.Id LIMIT 25
此查询占用我的计算机2.7秒,这是绝对错误的。我尝试执行此查询的解释,发现 possible_keys 列中是 Boundaries ,而<< em> key 列,这意味着空间索引将被完全忽略。
现在,我到目前为止所做的尝试:
现在有趣的是:
当我从一个像POINT(Places.Lat, Places.Lon)
这样的随机位置将POINT(49.472240, 17.086672)
替换为常数时,它突然使用了空间索引,没有问题。甚至 EXPLAIN 都表明使用了索引,并且查询花费了0.000秒!
我的意思是,对数据库的最后一个位置执行LIMIT 1查询需要0.109秒,并且MariaDB不使用空间索引,但是当我保持该查询不变时,只需在POINT()函数中替换Lat和Lon具有常量值-与数据库中的最后一个常量相同,查询突然使用索引,耗时0.000秒。这两个查询的结果是相同的。
问题:为什么使用列中的数据而不是常量会阻止MariaDB使用空间索引?如何更改此查询,以便能够使用空间索引将所有300万个点相对快速地连接到城市?我不希望它能在几毫秒内加入,但是要花上几年的时间,如果1条记录花费了0.1秒的时间却没有索引。