我有两个( 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)
答案 0 :(得分:0)
此查询需要一段时间才能执行的原因是因为它必须扫描整个表。您永远不希望将“ALL”视为查询的类型。为了加快速度,您需要做出关于索引内容的明智决策。
请参阅MySQL站点上的以下文档:
答案 1 :(得分:0)
作为Dan之前回答的附加组件,您应该 考虑 索引连接列和where列。在这种情况下,这意味着两个表中的m_id cols和measure_list表中的sequence_end_time。它们足够小,您可以添加索引,运行解释计划并计算时间,然后更改索引并进行比较。应该相对快速地解决。