IN子句不使用索引(第2部分)

时间:2016-06-30 08:07:39

标签: mysql date join

这次是关于左连接的。这些是表定义:

CREATE TABLE `tb_workday` (
  `id` int(11) DEFAULT NULL,
  `wddate` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

tb_workday内容示例:

+----+------------+
| id | wddate     |
+----+------------+
|  1 | 2016-06-01 |
|  2 | 2016-06-02 |
|  3 | 2016-06-03 |
|  4 | 2016-06-04 |
|  5 | 2016-06-05 |

和tb_time

CREATE TABLE `tb_t` (
  `TBegDate` date NOT NULL,
  `TBegTime` time DEFAULT NULL,
  PRIMARY KEY (`TBegDate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

tb_time内容示例:

+------------+----------+
| TBegDate   | TBegTime |
+------------+----------+
| 2016-01-01 | 19:00:33 |
| 2016-01-02 | 22:23:33 |
| 2016-01-03 | 17:43:33 |
| 2016-01-04 | 00:02:33 |
| 2016-01-05 | 19:00:33 |
| 2016-01-06 | 06:28:33 |
| 2016-01-07 | 03:41:33 |
| 2016-01-08 | 11:24:33 | 

这是我想要的结果。我希望该表显示wddate和wddate + 1的tb_time结果:

+----+------------+------------+----------+
| id | wddate     | TBegDate   | TBegTime |
+----+------------+------------+----------+
|  1 | 2016-06-01 | 2016-06-01 | 23:51:33 |
|  1 | 2016-06-01 | 2016-06-02 | 18:40:33 |
|  2 | 2016-06-02 | 2016-06-02 | 18:40:33 |
|  2 | 2016-06-02 | 2016-06-03 | 11:45:33 |
|  3 | 2016-06-03 | 2016-06-03 | 11:45:33 |
|  3 | 2016-06-03 | 2016-06-04 | 20:01:33 |
|  4 | 2016-06-04 | 2016-06-04 | 20:01:33 |
|  4 | 2016-06-04 | 2016-06-05 | 06:24:33 |

我正在使用此查询

SELECT * FROM tb_workday
LEFT JOIN tb_time ON TBegDate IN (WDDate,DATE_ADD(WDDate,INTERVAL 1 DAY))

但是tb_time的EXPLAIN结果是183行,根本不使用索引。

现在我将其更改为确切的日期

SELECT * FROM tb_wd
LEFT JOIN tb_t ON TBegDate IN ("2016-01-01","2016-01-02")

这次EXPLAIN结果是2行。

我希望前一个查询使用索引。请回答这个问题而不要进入UNION查询。我之前问过这个问题(How to make multiple LEFT JOINs with OR fully use a composite index? (part 2)),但由于我的英语,我没有表达我的问题,所以我在这里做得更简单。我想同时使用IN子句和索引。

0 个答案:

没有答案