当我想得到一个左连接SQL的计数时,我花了很长时间,1分钟后我取消了查询,没有得到结果。
我有两张桌子。一个是customer,它看起来像:
- - - - - - - - 顾客 - - - - - - - -
`ID` int(11) NOT NULL AUTO_INCREMENT,
`drpc` int(10) DEFAULT NULL,
`VIN` varchar(60) COLLATE utf8_bin DEFAULT NULL,
`cph` varchar(30) COLLATE utf8_bin DEFAULT NULL,
//... another 60+ columns here
`invalid` int(1) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `index_drpc_cph` (`drpc`,`cph`),
KEY `index_drpc_vin` (`drpc`,`VIN`),
KEY `index_drpc_invalid` (`drpc`,`invalid`),
KEY `index_cph` (`cph`)
另一个是repair,它看起来像:
- - - - - - -修理 - - - - - - - -
`ID` int(11) NOT NULL AUTO_INCREMENT,
`drpc` int(10) NOT NULL,
`cph` varchar(10) DEFAULT NULL,
`czbh` varchar(15) DEFAULT NULL,
`gdh` varchar(12) DEFAULT NULL,
`kdrq` date DEFAULT NULL,
// ... another 20+ columns here
`invalid` int(1) DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `gmrepair_cph` (`cph`),
KEY `gmrepair_czbh` (`czbh`),
KEY `gmrepair_gdh` (`gdh`),
KEY `gmrepair_drpc_kdrq` (`drpc`,`kdrq`),
KEY `index_drpc_invalid` (`drpc`,`invalid`),
KEY `index_drpc_cph` (`drpc`,`cph`)
两个表都有一个字段:'cph'。
最初的要求是:对于给定的drpc,获取那些存在于customer中但不存在于repair中的数据cph。
我的 sql 语句如下所示:
SELECT * FROM customer c LEFT JOIN
( SELECT cph FROM repair b WHERE b.drpc=77) r ON c.cph = r.cph
WHERE c.drpc = 76 AND r.cph IS NULL
这是解释结果:
BTW,对于修复表中的drpc = 77,大约有20k条记录;
对于客户表中的 drpc = 76,大约有 60k 条记录。
两个表的存储都是:InnoDB。
执行上面的sql大约需要3秒。
但是,当我想得到上面提到的 sql 的计数时,我需要很长时间。它甚至无法在 60 秒内完成。
我不确定问题是什么。能否请您给我一些指点,谢谢一百万!