我正在寻求深入了解为什么 MySQL 在某些地理空间查询场景中可能优于 PostGIS PostgreSQL,以及是否建议继续使用 MySQL 来实现此类目的而不是 PostGIS PostgreSQL。
我最近对 MySQL 和 PostGIS PostgreSQL 执行地理空间查询的性能进行了比较。令人惊讶的是,MySQL 查询在执行时间方面优于 PostGIS PostgreSQL 查询。以下是查询及其各自的执行时间:
MySQL 查询:
SELECT roads
FROM tbl_allroads
WHERE ST_Intersects(points, ST_Buffer(ST_GeomFromText('POINT(17.0809031 120.9019854)', 4326), 0.00027027))
ORDER BY ST_Distance(points, ST_GeomFromText('POINT(17.0809031 120.9019854)', 4326))
LIMIT 1;
根据 MySQL,总查询运行时间:0.0009 秒
PostGIS PostgreSQL 查询:
SELECT *
FROM tbl_road
WHERE ST_DWithin(
tbl_road.coordinates::geography,
ST_SetSRID(ST_MakePoint(120.9019854, 17.0809031), 4326)::geography,
20 -- distance in meters
);
根据 Postgre Sql:总查询运行时间:49 毫秒
虽然 MySQL 查询的执行速度明显更快,但我有兴趣了解为什么会出现这种情况。此外,我不确定是否建议继续使用 MySQL 通过 PostGIS PostgreSQL 进行地理空间查询。任何有关性能差异的见解以及在用于地理空间目的的两个数据库之间进行选择的建议将不胜感激。
对于上下文,我使用带有空间索引的 MySQL 8,并且数据集包含数千行。另一方面,PostGIS PostgreSQL 版本为 16.2,由 Visual C++ build 1937 编译,64 位,配置如下:“3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1”。
可能是因为你要求 PostGIS 认为地球是圆的,而 MySQL 的查询假设世界是平的,所以你只能通过 PostGIS 查询得到正确的答案。
当然,如果您重视速度而不是正确性,您可以继续使用 MySQL 或只是将 PostGIS 查询中的地理数据转换为地理数据,但我不建议这样做。