MySQL表联接索引仅在特定条件下工作

MySQL表联接索引仅在特定条件下工作,mysql,join,indexing,Mysql,Join,Indexing,这里有一个单数的。我有一个多表联接查询,为联接条件指定了正确的索引。当其中一个表被设置为主联接(.7秒完成)时,查询将与索引一起运行,但当另一个表被设置(189秒完成)时,查询不会运行。我希望有人能帮助我理解为什么索引在第二种情况下有效,但在第一种情况下无效。我已包括以下连接条件以及每个查询的解释: 连接索引不工作: FROM (( `fuse` LEFT JOIN `occupancy` ON ((

这里有一个单数的。我有一个多表联接查询,为联接条件指定了正确的索引。当其中一个表被设置为主联接(.7秒完成)时,查询将与索引一起运行,但当另一个表被设置(189秒完成)时,查询不会运行。我希望有人能帮助我理解为什么索引在第二种情况下有效,但在第一种情况下无效。我已包括以下连接条件以及每个查询的解释:

连接索引不工作:

        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