2013-09-25 23 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()沒有意義」 哦,真的嗎?))你試過了嗎?我認爲,如果你不在主題中,這是沒有意義的) –