MySQL表联接索引仅在特定条件下工作
这里有一个单数的。我有一个多表联接查询,为联接条件指定了正确的索引。当其中一个表被设置为主联接(.7秒完成)时,查询将与索引一起运行,但当另一个表被设置(189秒完成)时,查询不会运行。我希望有人能帮助我理解为什么索引在第二种情况下有效,但在第一种情况下无效。我已包括以下连接条件以及每个查询的解释: 连接索引不工作:MySQL表联接索引仅在特定条件下工作,mysql,join,indexing,Mysql,Join,Indexing,这里有一个单数的。我有一个多表联接查询,为联接条件指定了正确的索引。当其中一个表被设置为主联接(.7秒完成)时,查询将与索引一起运行,但当另一个表被设置(189秒完成)时,查询不会运行。我希望有人能帮助我理解为什么索引在第二种情况下有效,但在第一种情况下无效。我已包括以下连接条件以及每个查询的解释: 连接索引不工作: FROM (( `fuse` LEFT JOIN `occupancy` ON ((
FROM
((
`fuse`
LEFT JOIN `occupancy` ON (((
CONVERT(substring_index(
`occupancy`.`last_name`,
'_',-(
1
)),UNSIGNED INTEGER) = `fuse`.`agent_id`
)
AND ( `fuse`.`login_date` = `occupancy`.`login_date` )))
LEFT JOIN `reporting_match` ON ((
`fuse`.`agent_id` = `reporting_match`.`agent_id`
)))
)
连接索引工作:
FROM
((
`occupancy`
LEFT JOIN `fuse` ON (((
CONVERT(substring_index(
`occupancy`.`last_name`,
'_',-(
1
)),UNSIGNED INTEGER) = `fuse`.`agent_id`
)
AND ( `fuse`.`login_date` = `occupancy`.`login_date` )))
LEFT JOIN `reporting_match` ON (
substring_index(
`occupancy`.`last_name`,
'_',-(
1
)) = `reporting_match`.`agent_id`
))
)
谢谢大家,当我发布这篇文章时有点累了。我通过删除子字符串_indexjoin条件,并在数据导入时将子字符串正在收集的ID追加到占用表中来解决这个问题。然后,我将该ID用作fuse表的新连接条件。可能需要注意的是:规范化模式,不要将ID附加到名称。从名称中获取ID的函数调用阻止索引用于该条件。问题并提供一个示例,即至少表和索引的完整DDL。还提供完整的查询,特别是
WHERE
子句。谢谢,此查询中没有WHERE子句,因此没有其他内容。我想我只是想在导入时在名称中拆分该ID。不幸的是,我无法从为该表生成数据的系统中获得一个干净的ID,但我可能会通过解析该ID来解决我的问题。我认为这是左连接
,但我不确定。这可能解释了a LEFT JOIN b
和b LEFT JOIN a
在语义上的不同LEFT JOIN
表示当“right”表中的一行丢失时,将使用NULLs
。