【发布时间】:2015-03-14 02:46:12
【问题描述】:
我有 2 个表,每个表有几千行,我需要根据 2 个日期时间之间的日期时间加入它们。
select SQL_NO_CACHE * from A
left outer join R on R.ActivityDate > A.StartDate and R.ActivityDate < A.EndDate;
目前查询速度很慢。我尝试添加索引,但根据解释的输出没有使用它们。这种查询的适当索引策略是什么?使用 between doesn't 代替 似乎没有什么不同。
如果执行直接连接,查询速度会快 13 倍(返回的行数减少 7%),但从逻辑上讲,我需要返回不匹配的行。当附加行数如此之低时,我不希望 2 种连接类型之间的差异如此之大。为什么外部连接这么慢?
感谢任何帮助或想法。
mysql> describe A;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| StartDate | datetime | NO | | NULL | |
| EndDate | datetime | NO | | NULL | |
| Data | varchar(100) | NO | | NULL | |
+-----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> describe R;
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| ActivityDate | datetime | NO | | NULL | |
| Leads | int(11) | NO | | NULL | |
+--------------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
【问题讨论】:
-
使用
<和/或>通常不会使用索引。 -
我不确定您是否会得到任何改进,但您是否尝试过
BETWEEN而不是>和<? -
我尝试过。我将把它添加到问题中。
-
为什么表没有 auto_increment ID 字段?
标签: mysql join inner-join outer-join