我们已将 MySql 5.7 数据库的副本迁移到 Amazon RDS 上的 MySql 8.0.11。在可能的情况下,一切都是相同的。包含几何数据的表已被修改,因此几何列被限制为 SRID 0 并重建空间索引。两个数据库上的执行计划相同,表明查询使用的是空间索引。
在 MySql 5.7 上,以下查询需要 0.001 秒,在 MySql 8 上需要 108 秒。查看 MySql 8 上 100% 的执行统计信息“发送数据”。为什么?
SELECT r.roadid
FROM geocoder.osm_road r
WHERE mbrintersects(ST_Buffer(ST_GEOMETRYFROMTEXT('Point(-1.91289 52.58260)',0),0.0005), r.geometry)
Run Code Online (Sandbox Code Playgroud)
我们有许多不同的空间查询,而且所有查询都如此,但特别是 MBRINTERSECTS 和 ST_INTERSECTS 似乎非常慢。更改为 ST_CONTAINS(在可能的情况下)会带来显着的改进(即上述需要 3 秒而不是 108 秒),但这并不适合许多查询,并且仍然比 5.7 慢了很多。
Show Create Table for 5.7
CREATE TABLE `osm_road` (
`roadid` bigint(20) NOT NULL,
`reference` varchar(20) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`dictionary` longtext,
`road_speed_limit` tinyint(4) unsigned NOT NULL,
`road_speed_unitid` tinyint(1) NOT …Run Code Online (Sandbox Code Playgroud)