为什么这个MySQL JOIN语句会返回更多结果?

时间:2010-07-09 17:11:24

标签: mysql

我有两个( characteristic_list measure_list )表,这些表通过名为“m_id”的列相互关联。我想在日期范围内使用过滤器(来自 characteristic_list 的列)检索记录(来自 measure_list 的列)。当我使用INNER JOIN提供以下SQL时,检索记录需要一段时间。我做错了什么?

mysql> explain select c.power_set_point, m.value, m.uut_id, m.m_id, m.measurement_status, m.step_name from measure_list as m INNER JOIN characteristic_lis
t as c ON (m.m_id=c.m_id) WHERE (m.sequence_end_time BETWEEN '2010-06-18'  AND '2010-06-20');
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | c     | ALL  | NULL          | NULL | NULL    | NULL | 82952 |             | 
|  1 | SIMPLE      | m     | ALL  | NULL          | NULL | NULL    | NULL | 85321 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
2 rows in set (0.00 sec)

mysql> select count(*) from measure_list;
+----------+
| count(*) |
+----------+
|    83635 | 
+----------+
1 row in set (0.18 sec)

mysql> select count(*) from characteristic_list;
+----------+
| count(*) |
+----------+
|    83635 | 
+----------+
1 row in set (0.10 sec)

2 个答案:

答案 0 :(得分:0)

此查询需要一段时间才能执行的原因是因为它必须扫描整个表。您永远不希望将“ALL”视为查询的类型。为了加快速度,您需要做出关于索引内容的明智决策。

请参阅MySQL站点上的以下文档:

http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html

http://dev.mysql.com/doc/refman/5.1/en/using-explain.html

答案 1 :(得分:0)

作为Dan之前回答的附加组件,您应该 考虑 索引连接列和where列。在这种情况下,这意味着两个表中的m_id cols和measure_list表中的sequence_end_time。它们足够小,您可以添加索引,运行解释计划并计算时间,然后更改索引并进行比较。应该相对快速地解决。