假设我需要查询一家公司的员工。我有一个表格,“交易”,其中包含每笔交易的数据。
CREATE TABLE `transactions` (
`transactionID` int(11) unsigned NOT NULL,
`orderID` int(11) unsigned NOT NULL,
`customerID` int(11) unsigned NOT NULL,
`employeeID` int(11) unsigned NOT NULL,
`corporationID` int(11) unsigned NOT NULL,
PRIMARY KEY (`transactionID`),
KEY `orderID` (`orderID`),
KEY `customerID` (`customerID`),
KEY `employeeID` (`employeeID`),
KEY `corporationID` (`corporationID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
查询此表中的员工相当简单,但有一个转折点:每个员工注册一次交易记录,因此每个订单可能有多个记录用于一个公司。
例如,如果公司 1 的员工 A 和 B 都参与向公司 2 出售吸尘器,则“交易”表中将有两条记录;每个员工一个,公司 1 两个。不过,这一定不会影响结果。来自公司 1 的交易,无论涉及多少员工,都必须被视为一项交易。
容易,我想。我将在派生表上进行连接,如下所示:
SELECT corporationID FROM transactions JOIN (SELECT DISTINCT orderID FROM transactions WHERE corporationID = 1) AS foo USING (orderID)
该查询返回与公司 1 进行交易的公司列表。这正是我所需要的,但它非常慢,因为 MySQL 无法使用公司 ID 索引来确定派生表。我了解 MySQL 中的所有子查询/派生表都是这种情况。
我还尝试单独查询 orderID 的集合并使用一个非常大的 IN() 子句(通常是 100 000+ 个 ID),但事实证明 MySQL 在使用非常大的 IN() 子句的索引时也存在问题结果查询时间没有改善。
有没有其他可用的选项,还是我都用尽了它们?