我有几十个表,我必须经常使用三个字符串字段加入。
f1,f2和f3始终不为空,并且每个都有固定数量的字符。
我知道这不是最优,但我只能查询数据库,我不负责设计。
我用于查询的条件是:
concat(table1.f1, table1.f2, table1.f3) = concat (table2.f1, table2.f2, table2.f3)
这些查询针对的是具有数百万个注册表的数据库,因此查询总是需要几分钟。
但是低头,我想如果我写下面的内容,或许联接更快?
table1.f1 = table2.f1
and table1.f2 = table2.f2
and table1.f3 = table2.f3
我在想,也许数据库可以利用索引只连接所需的行?
有时我对必须连接的行非常严格,但我认为在连接查询中,所有行始终匹配,并且一旦表连接就会丢弃行。
如果我知道table2.f6 ='whatever'和table2.f7 ='what'等,那么查询是否会连接所有行然后丢弃其中的大多数行是否有意义?
因为我认为以下三个查询是相同的,就它们的最佳程度而言。我是对的吗?
SELECT ...
FROM table1
INNER JOIN table2
ON table1.f1 = table2.f1
and table1.f2 = table2.f2
and table1.f3 = table2.f3
and table2.f6 = 'whatever here'
SELECT ...
FROM table1
INNER JOIN table2
ON table1.f1 = table2.f1
and table1.f2 = table2.f2
and table1.f3 = table2.f3
WHEN table2.f6 = 'whatever here'
SELECT ...
FROM table1, table2
WHEN table1.f1 = table2.f1
and table1.f2 = table2.f2
and table1.f3 = table2.f3
and table2.f6 = 'whatever here'
那么,我是否应该使用concat,以及限制连接查询中的行以使其更快的最佳方法是什么?
谢谢!
答案 0 :(得分:3)
隐藏任何加速/效率,请注意进行批量连接比较v.s.个人比较将给你错误/无效的结果:
给出四个字段及其值:
w x y z
-----------------------------
abcd ef ab cdef
并且您将w / x对与y / z进行比较,然后:
concat(w,x) == concat(y,z) (w == y) && (x == z)
'abcd' + 'ef' == 'ab' + 'cdef' ('abcd' == 'ab') && ('abcd' == 'ef')
'abcdef' == 'abcdef' false && false
TRUE FALSE