2010-07-09 72 views
0

我有两个(characteristic_listmeasure_list)通过名为'm_id'的列相互关联的表。我想在日期范围内使用过滤器(来自characteristic_list的列)检索记录(从measure_list列)。当我使用INNER JOIN提供以下SQL时,需要一段时间来检索记录。我究竟做错了什么?为什么这个MySQL JOIN语句返回更多结果?

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

此查询需要一段时间才能执行的原因是因为它必须扫描整个表。你永远不想看到“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

+0

感谢您的回答。为了跟进,你会推荐多少个索引以及一个超过100万行的表。添加所有属于或将要成为WHERE条件的列是否可以? – cfpete 2010-07-09 18:29:52

+0

这真的取决于。只有正确数量的索引和太多索引之间有一条细线。当然,尝试为包含在WHERE条件中的列创建索引(以及在JOIN条件中使用的ID字段)。如果你获得了更好的性能,并且索引文件不会变得太大,那就去做吧。在我看来,查询优化是一种“黑暗艺术”。对我来说,这是相当受打击或错过的,并且对数据库的工作方式有广泛的了解。 – 2010-07-09 20:00:10

+0

@cfpete:上面的问题在每个表中只显示了85K行。这只是一个抽样?如果这是真的,我认为它只代表小表,你可能不需要对这些指数非常谨慎。 – MJB 2010-07-09 21:14:14

0

作为一个附加于丹以前的答案,你应该考虑索引联接列和where列。在这种情况下,这意味着两个表中的m_id cols和measure_list表中的sequence_end_time。它们足够小,可以添加索引,运行解释计划和时间,然后更改索引并进行比较。应该比较快解决。

相关问题