主键优化

表的主键表示您在最重要的查询中使用的一列或一组列。它具有关联的索引,可提高查询性能。查询性能可以从NOT NULL优化中受益,因为它不能包含任何NULL值。使用InnoDB存储引擎,可以对表数据进行物理组织,以根据一个或多个主键列进行超快速查找和排序。

如果您的表又大又重要,但是没有明显的列或一组列用作主键,则可以创建一个单独的列,并使用自动增量值作为主键。当您使用外键联接表时,这些唯一的ID可用作指向其他表中相应行的指针。

空间索引优化

MySQL允许SPATIAL在NOT NULL几何值列上创建索引 (请参见 第11.4.10节“创建空间索引”)。优化器检查SRID索引列的属性,以确定用于比较的空间参考系统(SRS),并使用适合于SRS的计算。(在MySQL 8.0之前,优化器SPATIAL使用笛卡尔计算对索引值进行比较;如果该列包含具有非笛卡尔SRID的值,则此类操作的结果是不确定的。)

为了使比较正常工作,SPATIAL索引中的每一列都 必须受SRID限制。也就是说,列定义必须包括一个显式 SRID属性,并且所有列值都必须具有相同的SRID。

优化器SPATIAL仅考虑针对SRID限制的列的索引:

1、限于笛卡尔SRID的列上的索引启用笛卡尔边界框计算。

2、限于地理SRID的列上的索引可启用地理边界框计算。

优化器将忽略SPATIAL没有SRID属性(因此不受SRID限制)的列上的索引。MySQL仍然维护此类索引,如下所示:

1、他们对表的修改更新(INSERT, UPDATE, DELETE,等等)。即使列可能包含笛卡尔和地理值的混合,也会像索引是笛卡尔索引一样进行更新。

2、它们仅是为了向后兼容而存在(例如,能够在MySQL 5.7中执行转储并在MySQL 8.0中还原)。因为SPATIAL不受SRID限制的列上的索引

对优化器没有用,所以应该修改每个这样的列:

1、验证列中的所有值都具有相同的SRID。要确定几何列中包含的SRID col_name,请使用以下查询:

SELECT DISTINCT ST_SRID(col_name) FROM tbl_name;

2、如果查询返回多行,则该列包含SRID的混合。在这种情况下,请修改其内容,以便所有值都具有相同的SRID:

(1)重新定义该列以具有显式 SRID属性。

(2)重新创建SPATIAL索引。