Mysql spatial index length=0 not used for point (SRID 4326)
Why mysql don't create spatial index (does it mean if spatial index length=0 index was not created)?
OR maybe
Why query don't use spatial index (index length isn't an indicator)?
Mysql version 8.0.13 (on 5.7.24 work well)
CREATE TABLE `boundaries`.`nodes_coastline` (
`id` bigint(64) NOT NULL,
`coords` point NOT NULL,
`coordsSRID` point NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT;
ALTER TABLE `boundaries`.`nodes_coastline`
ADD PRIMARY KEY (`id`),
ADD SPATIAL KEY `coords` (`coords`),
ADD SPATIAL KEY `coordsSRID` (`coordsSRID`);
ALTER TABLE `boundaries`.`nodes_coastline` MODIFY `id` bigint(64) NOT NULL AUTO_INCREMENT;
SELECT N.id AS node_id,
NC.id AS coastline_node_id,
ST_DISTANCE_SPHERE(POINT(N.longitude, N.latitude), NC.coords) / 1000 AS distanceKm
FROM nodes N,
way_nodes WN,
nodes_coastline NC
WHERE ST_CONTAINS(
ST_GEOMFROMTEXT(
ST_ASTEXT(
ST_MAKEENVELOPE(
POINT((N.longitude + 1 / 111.1), (N.latitude + 1 / 111.1)),
POINT((N.longitude - 1 / 111.1), (N.latitude - 1 / 111.1))
)
),
4326
),
NC.coordsSRID
)
AND WN.node_id = N.id
AND WN.id = 586687989
ORDER BY distanceKm
LIMIT 1;
EXPLAIN
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| 1 | SIMPLE | WN | NULL | ref | PRIMARY,ix_node_id | PRIMARY | 8 | const | 122 | 100.00 | Using temporary; Using filesort |
| 1 | SIMPLE | N | NULL | eq_ref | PRIMARY | PRIMARY | 8 | WN.node_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | NC | NULL | ALL | NULL | NULL | NULL | NULL | 55400618 | 100.00 | Using where; Using join buffer (Block Nested Loop)|
EDIT
I found the answer:
- Field was not created with SRID 4326, but data were.
- ST_Contains function has not static geometry. In my query POINT(N.longitude, N.latitude).
But, I need dynamic POINTs. So, how to rewrite this query to support it?
mysql indexing geospatial spatial
add a comment |
Why mysql don't create spatial index (does it mean if spatial index length=0 index was not created)?
OR maybe
Why query don't use spatial index (index length isn't an indicator)?
Mysql version 8.0.13 (on 5.7.24 work well)
CREATE TABLE `boundaries`.`nodes_coastline` (
`id` bigint(64) NOT NULL,
`coords` point NOT NULL,
`coordsSRID` point NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT;
ALTER TABLE `boundaries`.`nodes_coastline`
ADD PRIMARY KEY (`id`),
ADD SPATIAL KEY `coords` (`coords`),
ADD SPATIAL KEY `coordsSRID` (`coordsSRID`);
ALTER TABLE `boundaries`.`nodes_coastline` MODIFY `id` bigint(64) NOT NULL AUTO_INCREMENT;
SELECT N.id AS node_id,
NC.id AS coastline_node_id,
ST_DISTANCE_SPHERE(POINT(N.longitude, N.latitude), NC.coords) / 1000 AS distanceKm
FROM nodes N,
way_nodes WN,
nodes_coastline NC
WHERE ST_CONTAINS(
ST_GEOMFROMTEXT(
ST_ASTEXT(
ST_MAKEENVELOPE(
POINT((N.longitude + 1 / 111.1), (N.latitude + 1 / 111.1)),
POINT((N.longitude - 1 / 111.1), (N.latitude - 1 / 111.1))
)
),
4326
),
NC.coordsSRID
)
AND WN.node_id = N.id
AND WN.id = 586687989
ORDER BY distanceKm
LIMIT 1;
EXPLAIN
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| 1 | SIMPLE | WN | NULL | ref | PRIMARY,ix_node_id | PRIMARY | 8 | const | 122 | 100.00 | Using temporary; Using filesort |
| 1 | SIMPLE | N | NULL | eq_ref | PRIMARY | PRIMARY | 8 | WN.node_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | NC | NULL | ALL | NULL | NULL | NULL | NULL | 55400618 | 100.00 | Using where; Using join buffer (Block Nested Loop)|
EDIT
I found the answer:
- Field was not created with SRID 4326, but data were.
- ST_Contains function has not static geometry. In my query POINT(N.longitude, N.latitude).
But, I need dynamic POINTs. So, how to rewrite this query to support it?
mysql indexing geospatial spatial
DoesEXPLAIN FORMAT=JSON SELECT ...
provide any useful extra information?
– Rick James
Nov 15 '18 at 5:06
add a comment |
Why mysql don't create spatial index (does it mean if spatial index length=0 index was not created)?
OR maybe
Why query don't use spatial index (index length isn't an indicator)?
Mysql version 8.0.13 (on 5.7.24 work well)
CREATE TABLE `boundaries`.`nodes_coastline` (
`id` bigint(64) NOT NULL,
`coords` point NOT NULL,
`coordsSRID` point NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT;
ALTER TABLE `boundaries`.`nodes_coastline`
ADD PRIMARY KEY (`id`),
ADD SPATIAL KEY `coords` (`coords`),
ADD SPATIAL KEY `coordsSRID` (`coordsSRID`);
ALTER TABLE `boundaries`.`nodes_coastline` MODIFY `id` bigint(64) NOT NULL AUTO_INCREMENT;
SELECT N.id AS node_id,
NC.id AS coastline_node_id,
ST_DISTANCE_SPHERE(POINT(N.longitude, N.latitude), NC.coords) / 1000 AS distanceKm
FROM nodes N,
way_nodes WN,
nodes_coastline NC
WHERE ST_CONTAINS(
ST_GEOMFROMTEXT(
ST_ASTEXT(
ST_MAKEENVELOPE(
POINT((N.longitude + 1 / 111.1), (N.latitude + 1 / 111.1)),
POINT((N.longitude - 1 / 111.1), (N.latitude - 1 / 111.1))
)
),
4326
),
NC.coordsSRID
)
AND WN.node_id = N.id
AND WN.id = 586687989
ORDER BY distanceKm
LIMIT 1;
EXPLAIN
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| 1 | SIMPLE | WN | NULL | ref | PRIMARY,ix_node_id | PRIMARY | 8 | const | 122 | 100.00 | Using temporary; Using filesort |
| 1 | SIMPLE | N | NULL | eq_ref | PRIMARY | PRIMARY | 8 | WN.node_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | NC | NULL | ALL | NULL | NULL | NULL | NULL | 55400618 | 100.00 | Using where; Using join buffer (Block Nested Loop)|
EDIT
I found the answer:
- Field was not created with SRID 4326, but data were.
- ST_Contains function has not static geometry. In my query POINT(N.longitude, N.latitude).
But, I need dynamic POINTs. So, how to rewrite this query to support it?
mysql indexing geospatial spatial
Why mysql don't create spatial index (does it mean if spatial index length=0 index was not created)?
OR maybe
Why query don't use spatial index (index length isn't an indicator)?
Mysql version 8.0.13 (on 5.7.24 work well)
CREATE TABLE `boundaries`.`nodes_coastline` (
`id` bigint(64) NOT NULL,
`coords` point NOT NULL,
`coordsSRID` point NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT;
ALTER TABLE `boundaries`.`nodes_coastline`
ADD PRIMARY KEY (`id`),
ADD SPATIAL KEY `coords` (`coords`),
ADD SPATIAL KEY `coordsSRID` (`coordsSRID`);
ALTER TABLE `boundaries`.`nodes_coastline` MODIFY `id` bigint(64) NOT NULL AUTO_INCREMENT;
SELECT N.id AS node_id,
NC.id AS coastline_node_id,
ST_DISTANCE_SPHERE(POINT(N.longitude, N.latitude), NC.coords) / 1000 AS distanceKm
FROM nodes N,
way_nodes WN,
nodes_coastline NC
WHERE ST_CONTAINS(
ST_GEOMFROMTEXT(
ST_ASTEXT(
ST_MAKEENVELOPE(
POINT((N.longitude + 1 / 111.1), (N.latitude + 1 / 111.1)),
POINT((N.longitude - 1 / 111.1), (N.latitude - 1 / 111.1))
)
),
4326
),
NC.coordsSRID
)
AND WN.node_id = N.id
AND WN.id = 586687989
ORDER BY distanceKm
LIMIT 1;
EXPLAIN
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| 1 | SIMPLE | WN | NULL | ref | PRIMARY,ix_node_id | PRIMARY | 8 | const | 122 | 100.00 | Using temporary; Using filesort |
| 1 | SIMPLE | N | NULL | eq_ref | PRIMARY | PRIMARY | 8 | WN.node_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | NC | NULL | ALL | NULL | NULL | NULL | NULL | 55400618 | 100.00 | Using where; Using join buffer (Block Nested Loop)|
EDIT
I found the answer:
- Field was not created with SRID 4326, but data were.
- ST_Contains function has not static geometry. In my query POINT(N.longitude, N.latitude).
But, I need dynamic POINTs. So, how to rewrite this query to support it?
mysql indexing geospatial spatial
mysql indexing geospatial spatial
edited Nov 14 '18 at 18:49
Vasil Boichuk
asked Nov 14 '18 at 13:28
Vasil BoichukVasil Boichuk
111
111
DoesEXPLAIN FORMAT=JSON SELECT ...
provide any useful extra information?
– Rick James
Nov 15 '18 at 5:06
add a comment |
DoesEXPLAIN FORMAT=JSON SELECT ...
provide any useful extra information?
– Rick James
Nov 15 '18 at 5:06
Does
EXPLAIN FORMAT=JSON SELECT ...
provide any useful extra information?– Rick James
Nov 15 '18 at 5:06
Does
EXPLAIN FORMAT=JSON SELECT ...
provide any useful extra information?– Rick James
Nov 15 '18 at 5:06
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53301372%2fmysql-spatial-index-length-0-not-used-for-point-srid-4326%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53301372%2fmysql-spatial-index-length-0-not-used-for-point-srid-4326%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Does
EXPLAIN FORMAT=JSON SELECT ...
provide any useful extra information?– Rick James
Nov 15 '18 at 5:06