考虑以下查询:
mysql> SELECT count(*) FROM list l WHERE l.source='blink';
+----------+
| count(*) |
+----------+
| 3372 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT count(*) FROM list l LEFT JOIN cardinal c ON l.id=c.id WHERE c.resolution IN ('Left','Right','Up') AND l.source='blink';
+----------+
| count(*) |
+----------+
| 5116 |
+----------+
1 row in set (2.47 sec)
INSERT
在这两个查询运行之间,数据库上没有运行任何查询或其他查询。第二个查询似乎比第一个查询更具限制性,那么它如何返回更多行呢?请注意,该list
表有超过 200 万行,而该cardinal
表大约有 50 万行。
编辑:添加EXPLAIN
输出:
mysql> EXPLAIN SELECT count(*) FROM list l LEFT JOIN cardinal c ON l.id=c.id WHERE c.resolution IN ('Left','Right','Up') AND l.source='blink';
+----+-------------+-------+--------+-------------------+---------+---------+-------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------+---------+---------+-------------+--------+-------------+
| 1 | SIMPLE | c | ALL | NULL | NULL | NULL | NULL | 536258 | Using where |
| 1 | SIMPLE | l | eq_ref | PRIMARY,id,source | PRIMARY | 8 | direct.c.id | 1 | Using where |
+----+-------------+-------+--------+-------------------+---------+---------+-------------+--------+-------------+
2 rows in set (0.00 sec)
mysql> select count(*) from list;
+----------+
| count(*) |
+----------+
| 2165664 |
+----------+
1 row in set (1.32 sec)
mysql> select count(*) from cardinal;
+----------+
| count(*) |
+----------+
| 537007 |
+----------+
1 row in set (0.23 sec)
第一个表中的每一行可以匹配第二个表中的多行。
您可以通过以下方式检查:
这里有一个关于 SQL Fiddle 的小演示。
您的问题与您添加限制无关,而是与 JOIN 相关。
例如,当表
l
中的一行在 中具有 3 个相应的行时c
,将向结果集中添加三行。