2013-09-25 24 views
0

我有一个问题,PHP的mysqli扩展和时间戳索引。PHP的mysqli扩展和时间戳索引

我有一个MySQL表是这样的:

CREATE TABLE `Test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) unsigned NOT NULL DEFAULT '0', 
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    'accepted',  
    PRIMARY KEY (`id`), 
    KEY `created` (`created`),  
    KEY `user_id` (`user_id`,`oid`)   
) ENGINE=InnoDB; 

我作出这样的要求:

SELECT * FROM `Test` WHERE created='2013-09-24 19:35:09'; 

当我使用EXPLAIN从MySQL控制台或PHP MySQL扩展这一要求我看到:

possible_keys: created  
key: created  
key_len: const 
ref: const  
rows: 2 

但是,当我做出同样的EXPLAIN从PHP mysqli扩展要求我有结果:

possible_keys: null  
key: null  
key_len: null  
ref: null  
rows: 31597251 

这就是说,mysqli扩展没有看到日期时间索引并且不能使用它。 USE INDEX(已创建)和FORCE INDEX(已创建)不起作用。

我该如何'解释'Mysqli扩展应该使用日期时间索引?

+1

请提供您的PHP代码,这将导致您的FULL SCAN情况。 –

+0

不够清楚...提​​供代码示例 – jcobhams

+0

这是不可能的。 Mysqli与查询计划无关。 Mysqli不执行你的查询 - 它只是一个将你的查询发送到mysql服务器的API。 –

回答

-1

我找到了解决办法。

我应该使用:

SELECT * FROM `Test` WHERE created>=TIMESTAMP("2013-09-24 19:35:09"); 

而不是索引总是使用。在另一种情况下,mysql会尝试将int(datetime)与string进行比较,但不能。

感谢大家。

+0

但是'> ='与'='不一样。你肯定是在某个地方弄错了。另外,在日期时间值上执行'TIMESTAMP()'是没有意义的。你得到的解释是错误的。问题在别的地方。很可能你正在运行你的mysqli查询来对付错误的数据库。 –

+0

或者,当'> ='完全扫描时,确实可以使用'='作为'const'查询。当引擎决定涉及的记录超过50%时,不使用索引。 –

+0

>“对日期时间值做TIMESTAMP()没有意义” 哦,真的吗?))你试过了吗?我认为,如果你不在主题中,这是没有意义的) –