考虑有三个表:A
,B
和C
和下面的简单查询:
SELECT *
FROM A
LEFT JOIN (
SELECT *
FROM B
INNER JOIN C ON (B.bid = C.bfid)
) s ON (A.bfid = s.bid)
如果子查询选择的行太多,这个查询将是一个拖累,因为MySQL不会使用任何索引A.bfid = s.bid
。如果有多个子查询,则这种情况会变得更糟。
有谁知道如何优化这种情况?
这是表结构和示例数据:
CREATE TABLE A (aid INT, bfid INT, PRIMARY KEY (aid));
CREATE TABLE B (bid INT, PRIMARY KEY (bid));
CREATE TABLE C (cid INT, bfid int, PRIMARY KEY (cid));
INSERT INTO B VALUES (1), (2), (3);
INSERT INTO A VALUES (4, 1), (5, 2);
INSERT INTO C VALUES (6, 2), (7, 3);
有了这些,查询将输出:
+-----+------+------+------+------+
| aid | bfid | bid | cid | bfid |
+-----+------+------+------+------+
| 4 | 1 | NULL | NULL | NULL |
| 5 | 2 | 2 | 6 | 2 |
+-----+------+------+------+------+
一种可行的方法是使用一对LEFT联接,然后根据是否在C:-上找到匹配项来确定是否返回B.adid。
SELECT A.*,
IF(C.bfid IS NULL, NULL, B.bid),
IF(C.bfid IS NULL, NULL, C.cid),
IF(C.bfid IS NULL, NULL, C.bfid)
FROM A
LEFT OUTER JOIN B ON A.bfid = B.bid
LEFT OUTER JOIN C ON B.bid = C.bfid
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句