Sql 查询优化-使用likes的多个连接条件

Sql 查询优化-使用likes的多个连接条件,sql,Sql,我遇到了一些情况,我的新手级别的SQL经验与之相匹配 我有一个问题 SELECT a.One, a.Two, a.Three, a.Four, b.One, b.Two FROM table1 a INNER JOIN table2 b on b.Four = a.Nine and b.Six like a.One and b.Seven like b.Two 表1是25000行 表2是2200万行 like子

我遇到了一些情况,我的新手级别的SQL经验与之相匹配

我有一个问题

SELECT a.One, 
    a.Two, 
    a.Three, 
    a.Four, 
    b.One, 
    b.Two
FROM table1 a
INNER JOIN table2 b on b.Four = a.Nine
        and b.Six like a.One
        and b.Seven like b.Two
  • 表1是25000行
  • 表2是2200万行
  • like子句的工作原理类似于这个“test%”,所以它应该利用我拥有的索引,我认为我不需要全文索引,因为它是尾随的,而不是前面的
  • 我有一个存在的索引,当我使用一个直接的equals而不是like时,它非常有效
当我查看查询计划时,我看到我正在浏览表2中的每一行(我很惊讶)。就先执行的内容而言,内部联接是如何工作的?它是否将三列合并为联接?或者它与第一列、第二列、第三列连接


有没有更好的方法来编写此查询?

问题是索引只能用于一个
,如“pattern%”
比较。这是一个不等式,因此索引的使用在第一个不等式处停止

如果将查询更改为
联合,您可能会很幸运:

SELECT a.One, a.Two, a.Three, a.Four, b.One, b.Two
FROM table1 a INNER JOIN
     table2 b
     ON b.Four = a.Nine and b.Six like a.One
UNION
SELECT a.One, a.Two, a.Three, a.Four, b.One, b.Two
FROM table1 a INNER JOIN
     table2 b
     ON b.Four = a.Nine and bb.Seven like b.Two;

然后,在
a(九,一)
b(四,二)
上设置索引。尽管这两个子查询应该使用索引,但您可能会得到许多中间结果的匹配,从而减慢查询速度。

您能否发布1)每个表的
SHOW CREATE TABLE
输出(或RDBMS的等效输出),以及2)性能问题的
EXPLAIN
输出(或等效执行计划),您应该始终包括您正在使用的数据库。您可能需要a(1,9)和/或b(2,4)的数据库一文不值,这取决于正在使用的RDBMS以及它如何维护和应用索引统计信息。