gpt4 book ai didi

MYSQL - 使用 OR 条件连接

转载 作者:行者123 更新时间:2023-11-29 11:38:34 26 4
gpt4 key购买 nike

我有3个表CompanyMaster(有300万行),Token1,Token2,表结构是,

CompanyMaster

CREATE TABLE `CompanyMaster` (
`CompanyUID` int(11) NOT NULL AUTO_INCREMENT,
`WebDomain` varchar(150) DEFAULT NULL,
`CompanyPrimaryName` varchar(200) DEFAULT NULL,
PRIMARY KEY (`CompanyUID`)
) ENGINE=InnoDB AUTO_INCREMENT=3941244 DEFAULT CHARSET=latin1

token 1

CREATE TABLE `Token1`(
`CompanyUID` int(11) NOT NULL,
`Token` varchar(50) NOT NULL,
KEY `Token` (`Token`),
KEY `CompanyUID` (`CompanyUID`),
CONSTRAINT `CompanyAlias4_ibfk_1` FOREIGN KEY (`CompanyUID`) REFERENCES `CompanyMaster` (`CompanyUID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

token 2

CREATE TABLE `Token2` (
`CompanyUID` int(11) NOT NULL,
`Token` varchar(100) NOT NULL,
KEY `Token` (`Token`),
KEY `CompanyUID` (`CompanyUID`),
CONSTRAINT `CompanyAlias5_ibfk_1` FOREIGN KEY (`CompanyUID`) REFERENCES `CompanyMaster` (`CompanyUID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

我想使用 Token1 和 Token2 表从 CompanyMaster 表获取 WebDomain。

我正在使用的查询是,

SELECT WebDomain FROM CompanyMaster WHERE CompanyUID IN (
SELECT CompanyUID FROM Token1 WHERE Token='appleinc'
UNION
SELECT CompanyUID FROM Token2 WHERE Token='d012233:q122100:')

此查询需要近 30 秒才能获得结果。我单独执行了子查询,耗时< 100 毫秒。所以问题出在 IN 条件上。

我用 join 替换了查询,它在 < 200 毫秒内执行,

SELECT c.CompanyUID FROM `CompanyMaster` c
JOIN `Token1` tk1
ON tk1.CompanyUID = c.CompanyUID AND tk1.Token= 'appleinc'
JOIN `Token2` tk2
ON tk2.CompanyUID = c.CompanyUID AND tk2.Token= 'd012233:q122100:'

但是上述查询的问题是,如果 tk1.Alias = 'appleinc' 或 tk2.Alias = 'd012233:q122100:' 失败,则输出为空行。但即使只有一个条件匹配,我也想要匹配的行。

请帮我解决这个问题?我还希望查询在 10 毫秒内执行。可以实现吗?

最佳答案

使用 UNION ALL 肯定会比使用 UNION 获得更好的性能,因为它对于您的输出情况没有区别,但是 it does not need to filter out duplicates like UNION does :

SELECT     WebDomain 
FROM CompanyMaster
WHERE CompanyUID IN
( SELECT CompanyUID
FROM Token1
WHERE Token = 'appleinc'
UNION ALL
SELECT CompanyUID
FROM Token2
WHERE Token = 'd012233:q122100:')

但是,如果您将 UNION 放在外部查询中,它甚至可能会提供更好的性能,如下所示:

SELECT     WebDomain 
FROM CompanyMaster m
INNER JOIN Token1 t ON t.CompanyUID = m.CompanyUID
WHERE Token = 'appleinc'
UNION
SELECT WebDomain
FROM CompanyMaster m
INNER JOIN Token2 t ON t.CompanyUID = m.CompanyUID
WHERE Token = 'd012233:q122100:'

在这里,仅获取唯一值可能很重要,因此您需要 UNION 而无需 ALL

关于MYSQL - 使用 OR 条件连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com