【发布时间】:2013-08-27 02:16:05
【问题描述】:
当我想获取左连接 SQL 的计数时,我需要很长时间, 1分钟后我取消了查询,没有得到结果。
我有两张桌子。 一个是客户,它看起来像:
----------------客户---------------
`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,获取那些cph存在于customer但不存在于repair的数据强>。
我的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
解释结果如下:
顺便说一句, 对于修复表中的drpc = 77,大约有20k条记录;
对于客户表中的drpc = 76,大约有60k条记录。
两个表的存储都是:InnoDB。
执行上面的sql大约需要3秒。
但是,当我想得到上面提到的sql的计数时,我需要很长时间。它甚至无法在 60 秒内完成。
我不确定问题是什么。 能否请您给我一些指点,谢谢一百万!
【问题讨论】:
-
当你测量 3 秒时,是所有记录都返回还是只出现第一条记录?
-
@GordonLinoff,这不是所有的记录,我很害怕,它只是前 1000 条记录。
-
短查询可能仍然需要一分钟以上才能获取所有行。
count(*)必须等到所有行都完成,所以时间比较不是苹果对苹果。 -
根据您的解释,您应该删除该派生表,即删除
left join ( select ... )部分。
标签: mysql performance count