Мы перенесли копию базы данных MySql 5.7 в MySql 8.0.11 на Amazon RDS.Там, где это возможно, все идентично.Таблица, содержащая данные геометрии, была изменена, поэтому столбец геометрии ограничен SRID 0 и пространственный индекс перестроен.План выполнения в обеих базах данных идентичен и указывает на то, что запрос использует пространственный индекс.
В MySql 5.7 следующий запрос занимает 0,001 с, а в MySql 8 - 108 с.Глядя на статистику выполнения «Отправка данных», приходится 100% времени на MySql 8. Почему?
SELECT r.roadid
FROM geocoder.osm_road r
WHERE mbrintersects(ST_Buffer(ST_GEOMETRYFROMTEXT('Point(-1.91289 52.58260)',0),0.0005), r.geometry)
У нас много разных пространственных запросов, и все ведут себя так, но в особенности 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 NULL,
`road_type` tinyint(4) NOT NULL,
`is_toll_road` bit(1) NOT NULL DEFAULT b'0',
`is_one_way` bit(1) NOT NULL DEFAULT b'0',
`countryid` smallint(6) DEFAULT NULL,
`geometry` geometry NOT NULL,
`datemodified` datetime DEFAULT CURRENT_TIMESTAMP,
`datecreated` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`roadid`),
UNIQUE KEY `id_roadid` (`roadid`),
SPATIAL KEY `ix_road_geometry` (`geometry`),
KEY `ix_road_reference` (`reference`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=207
Show Create Table for 8.0.11
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 NULL,
`road_type` tinyint(4) NOT NULL,
`is_toll_road` bit(1) NOT NULL DEFAULT b'0',
`is_one_way` bit(1) NOT NULL DEFAULT b'0',
`countryid` smallint(6) DEFAULT NULL,
`geometry` geometry NOT NULL /*!80003 SRID 0 */,
`datemodified` datetime DEFAULT CURRENT_TIMESTAMP,
`datecreated` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`roadid`),
UNIQUE KEY `id_roadid` (`roadid`),
KEY `ix_road_reference` (`reference`),
SPATIAL KEY `ix_road_geometry` (`geometry`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=207
Показать индекс из osm_road (5.7)
Table,Non_unique,Key_name,Seq_in_index,Column_name,Collation,Cardinality,Sub_part,Packed,Null,Index_type,Comment,Index_comment
osm_road,0,PRIMARY,1,roadid,A,18973144,NULL,NULL,,BTREE,,
osm_road,1,ix_road_geometry,1,geometry,A,18973154,32,NULL,,SPATIAL,,
osm_road,1,ix_road_reference,1,reference,A,199900,NULL,NULL,YES,BTREE,,
Показать индекс из osm_road (8.0.11)
Table,Non_unique,Key_name,Seq_in_index,Column_name,Collation,Cardinality,Sub_part,Packed,Null,Index_type,Comment,Index_comment,Visible
osm_road,0,PRIMARY,1,roadid,A,16194921,NULL,NULL,,BTREE,,,YES
osm_road,1,ix_road_reference,1,reference,A,86215,NULL,NULL,YES,BTREE,,,YES
osm_road,1,ix_road_geometry,1,geometry,A,16194921,32,NULL,,SPATIAL,,,YES
Показать глобальный статус (8.0.11) Нажмите здесь
Показать глобальные переменные (8.0.11) Нажмите здесь
- Добавлено 2019-01-27 -----------------
EXPLAIN SELECT r.roadid FROM geocoder.osm_road r WHERE mbrintersects(ST_Buffer(ST_GEOMETRYFROMTEXT('Point(-1.91289 52.58260)',0),0.0005), r.geometry);
Возвращает:
select_type: Simple
table: r
partitions: null
possible_keys: ix_road_geometry
key: ix_road_geometry
key_len: 34
ref: null
rows: 1
filtered: 100
Extra: Using where