InnoDB是MySQL 5.7中推荐且实际可用的GIS空间索引引擎,支持POINT、LINESTRING、POLYGON等GEOMETRY类型列上的SPATIAL索引(R-tree),要求列非NULL、单列创建、配合ST_函数(如ST_Intersects)触发索引;MyISAM在5.7中已不推荐,存在优化器不识别、无事务、表锁等问题,官方标记为legacy。

InnoDB 是 MySQL 5.7 中唯一支持 GIS 空间索引的引擎,MyISAM 虽然历史上支持空间索引,但在 5.7 中已不推荐且存在严重限制。
InnoDB 支持 GIS 空间索引,但仅限特定类型
MySQL 5.7 的 InnoDB 引擎支持 POINT、LINESTRING、POLYGON 类型,并允许在这些列上创建 SPATIAL 索引(使用 R-tree)。但注意:
- 必须用
GEOMETRY或具体子类型声明列,且该列不能为NULL(否则建索引失败) -
SPATIAL索引只能建在单个GEOMETRY列上,不支持联合空间索引 - 函数如
ST_Within()、ST_Distance()在 5.7 中已可用,但ST_Distance不走索引(需配合ST_Distance_Sphere或先用MBRContains过滤) - 查询必须显式使用
ST_函数,WHERE geom && ST_GeomFromText(...)才能触发 R-tree 索引
MyISAM 的空间索引在 5.7 中基本不可用
虽然文档未明确移除,但实际中:
-
MyISAM的SPATIAL索引在 5.7 中无法被优化器正确选择,EXPLAIN显示type: ALL(全表扫描) -
MyISAM不支持事务,GIS 数据更新(如批量导入/裁剪)出错后无法回滚,极易导致空间数据不一致 -
MyISAM表级锁在并发写入 GIS 数据(如实时轨迹点插入)时会严重阻塞读查询 - 官方手册在 5.7 版本已将
MyISAM空间功能标记为“legacy”,且不保证后续补丁兼容
常见踩坑点:建了索引却没生效
- 忘记在
WHERE条件中用MBRContains()或ST_Intersects()等能触发 R-tree 的函数,只写geom = ...或ST_Distance(geom, ...) < 1000—— 后者完全不走索引 - 使用
WKT字符串直接比较(如geom = 'POINT(1 2)'),而非通过ST_GeomFromText()构造几何对象 -
SRID不匹配:5.7 要求所有参与空间操作的几何对象 SRID 一致,否则报错ER_WRONG_ARGUMENTS或静默退化为全表扫描
真正需要 GIS 能力时,别纠结“哪个更强”,而是确认你用的是 InnoDB,且查询写法严格匹配 R-tree 索引的触发条件。否则所谓“空间索引”只是摆设。


















