我有两个(characteristic_list和measure_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)
感谢您的回答。为了跟进,你会推荐多少个索引以及一个超过100万行的表。添加所有属于或将要成为WHERE条件的列是否可以? – cfpete 2010-07-09 18:29:52
这真的取决于。只有正确数量的索引和太多索引之间有一条细线。当然,尝试为包含在WHERE条件中的列创建索引(以及在JOIN条件中使用的ID字段)。如果你获得了更好的性能,并且索引文件不会变得太大,那就去做吧。在我看来,查询优化是一种“黑暗艺术”。对我来说,这是相当受打击或错过的,并且对数据库的工作方式有广泛的了解。 – 2010-07-09 20:00:10
@cfpete:上面的问题在每个表中只显示了85K行。这只是一个抽样?如果这是真的,我认为它只代表小表,你可能不需要对这些指数非常谨慎。 – MJB 2010-07-09 21:14:14