标题: mysql timestamp类型设置索引无效 [打印本页] 作者: 幸福糖 时间: 2015-2-2 11:41 标题: mysql timestamp类型设置索引无效 大家好,最近遇到一个问题,表结构如
CREATE TABLE `testone` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`sorder` VARCHAR(50) NOT NULL,
`trantime` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`trantype` VARCHAR(120) NOT NULL,
`income` DECIMAL(10,2) NOT NULL,
`abstract` VARCHAR(255) NOT NULL,
`remarks` VARCHAR(255) NOT NULL,
`status` TINYINT(2) NOT NULL,
`created` INT(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `trantime` (`trantime`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;
复制代码
然后线上数据有200W左右,SELECT COUNT(DISTINCT(trantime))/COUNT(*) FROM testone;的到的结果约为0.4;
我做了一个根据交易时间(trantime)的搜索功能[trantime索引是发现这个功能查询很慢的时候加上去的];但是加这个索引只用了10多秒,就好了,结果查询根本都用不上索引。然后我导出了5W条数据在我本地的windows环境和linux环境下,在windows环境下查询不用强制使用索引就用到了索引的,但是在linux下查询就没有用到索引了,强制也不行查询如下:
DESC SELECT * FROM testone FORCE INDEX(trantime) WHERE trantime = '2013-01-01 11:00:00';
结果是 [竟然不能上传图片]
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE testone ALL (NULL) (NULL) (NULL) (NULL) 50000 Useing where
不知道为啥 在linux下 就没有用到索引,线上的也是linux环境。我把这个timestamp类型切换为datetime依旧用不了索引,然后删除了索引再重建也是不行的。
后来在一篇博客里面看到了一个函数str_to_date();我尝试这个函数结果可以利用到索引了如下:
DESC SELECT * FROM testone WHERE trantime = STR_TO_DATE('2014-07-31 23:58:14','%Y-%m-%d %T');
结果是
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE testone ref trantime trantime 4 const 5 Useing where
原以为这样就可以了,但是直接查询
SELECT * FROM testone WHERE trantime = STR_TO_DATE('2014-07-31 23:58:14','%Y-%m-%d %T');
得到的结果却是空,用语句
SELECT * FROM testone WHERE trantime = '2014-07-31 23:58:14';
又是有5条语句的[但是这个用不到索引]。哎问题依旧没有解决。