【发布时间】:2016-11-01 23:55:18
【问题描述】:
这是表定义
CREATE TABLE `dt_prdtime` (
`TCompany` varchar(3) NOT NULL DEFAULT '',
`TPerCode` varchar(8) NOT NULL,
`TBegDateTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'วันที่',
`TQPay` int(1) NOT NULL DEFAULT '2',
`TYear` int(4) NOT NULL,
`TMonth` int(2) NOT NULL,
PRIMARY KEY (`TCompany`,`TPerCode`,`TBegDateTime`),
KEY `TMonth` (`TMonth`) USING BTREE,
KEY `TPerCode` (`TPerCode`,`TYear`,`TMonth`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
这是数据样本。此表有 10000+ 条记录,TMonth 字段中的值各不相同
+----------+----------+---------------------+-------+-------+--------+
| TCompany | TPerCode | TBegDateTime | TQPay | TYear | TMonth |
+----------+----------+---------------------+-------+-------+--------+
| S10 | 000001 | 2016-01-02 17:33:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-02 07:48:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-03 17:39:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-03 07:30:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-04 17:49:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-04 07:54:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-05 17:50:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-05 07:36:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-06 17:37:00 | 1 | 2016 | 1 |
| S10 | 000001 | 2016-01-06 07:35:00 | 1 | 2016 | 1 |
+----------+----------+---------------------+-------+-------+--------+
使用EXPLAIN,此查询使用TMonth 索引:
SELECT * FROM dt_prdtime WHERE TMonth = 5
虽然这个拒绝使用索引:
SELECT * FROM dt_prdtime WHERE TMonth IN (5,6)
我用另一个简单的表测试,
CREATE TABLE `table1` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
SELECT * FROM table2 WHERE id IN (5,6)
并且使用了该表的索引
谁能解释一下? dt_prdtime 表有问题吗?
【问题讨论】:
-
这可能是由于优化器造成的。有时优化器估计不使用索引,即使索引可用。你试过 FORCE 索引吗?
-
SELECT * FROM dt_prdtime FORCE INDEX (
TMonth) WHERE TMonth IN (5, 6) -
你不应该强制索引。现在是收拾行李而不使用 rdbms 的好时机
-
同意,因为如果不使用索引,我们必须相信优化器是有道理的
-
问五月是不是故意忽略了年份?如果没有,有更好的方法来完成你的任务,即使是 (5,6)。