我正在尝试编写一个有效的查询来从不同的表中拉出多个列。 5个表中的每一个都非常大;我当前的查询有效,但只使用50个账号#和代码组合需要2分钟。我需要查询返回3列,每列使用多个表中的条件从不同的表中。
这是当前的查询:
select table1.Name, table3.Account, table5.Code
from db_table1 table1, db_table2 table2,
db_table3 table3, db_table4 table4, db_table5 table5
where table1.Name = table2.Name and
table2.ID = 16 and
table2.PhoneNum = table3.PhoneNum and
table3.Account = table4.Account and
table4.Zip = table5.Zip and
((table3.Account = 1234567 and table5.Code = 'abcd') or
(table3.Account = 2345678 and table5.Code = 'bcde') or
(table3.Account = 3456789 and table5.Code = 'cdef'));
基本上,我有一个帐号#和代码列表,需要查看哪些行的名称与两者的组合相关联。我也只想要table2的ID = 16的行。我需要检索的3列都来自不同的表 - 由于这3个表不共享一个公共列,我被迫加入多个其他表。
编辑:这是一个公司数据库。某些语句被限制执行,例如delete,create,alter和drop。
谢谢!
答案 0 :(得分:1)
显式连接语法的主要好处是可读性,它使实际连接与有意交叉产品更加明显,并使连接标准与所连接的表保持相对接近。
就实际速度而言,查询优化器通常似乎可以很好地对事物进行排序,因此它通常不会对您造成任何影响(除了无法利用{{1}之类的查询修饰符允许您在优化程序做出错误选择的情况下强制执行操作顺序。)
例如,对我和其他许多人来说,这是一个更易读的查询版本:
query = (r"SELECT * FROM database.table ...")
我正在讨论的UNION技术会将上述查询转换为:
STRAIGHT_JOIN
SELECT t1.Name, t3.Account, t5.Code
FROM db_table1 AS 1
INNER JOIN db_table2 AS t2 ON t1.Name = t2.Name
INNER JOIN db_table3 AS t3 ON t2.PhoneNum = t3.PhoneNum
INNER JOIN db_table4 AS t4 ON t3.Account = t4.Account
INNER JOIN db_table5 AS t5 ON t4.Zip = t5.Zip
WHERE t2.ID = 16
AND
((t3.Account = 1234567 AND t5.Code = 'abcd')
OR (t3.Account = 2345678 AND t5.Code = 'bcde')
OR (t3.Account = 3456789 AND t5.Code = 'cdef')
)
;
通常会让MySQL无法利用索引,这样做可以使(有效)多个查询更简单,并且可以再次利用索引。 然而,在你需要之前做这种事情,除非你相当肯定需要这种技术(在不断增长的桌子上熟悉的模式)不是我推荐的东西,在很多情况下运行更多的查询(这就是这种of does不是最好的解决方案。