2013-01-17 82 views
0

我有,由於某種原因沒有使用任何索引一個相當簡單的查詢:的Mysql不使用任何索引

CREATE TABLE `events_self` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`date` int(10) unsigned NOT NULL, 
`username` varchar(16) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
`event` enum('status_update','follow_hashtag','make_hashtag','avatar','placeholder_3') CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
`obj_id` varchar(140) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
`inline` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
PRIMARY KEY (`id`,`date`), 
KEY `obj_id` (`obj_id`), 
KEY `user_date` (`username`,`date`), 
KEY `event` (`event`), 
KEY `x` (`event`,`inline`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


INSERT INTO `events_self` (`id`, `date`, `username`, `event`, `obj_id`, `inline`) VALUES (1, 1358359266, 'aaa', 'make_hashtag', '1', 'scene'); 

SELECT inline FROM events_self WHERE obj_id = 1; 

EXPLAIN SELECT inline FROM events_self WHERE obj_id = 1; 


+----+-------------+-------------+------+---------------+------+---------+------+---------+-------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------------+ 
| 1 | SIMPLE  | events_self | ALL | obj_id  | NULL | NULL | NULL | 1610702 | Using where | 
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------------+ 
1 row in set (0.00 sec) 

Server版本:5.3.2-MariaDB的-β-mariadb102〜萊尼日誌(MariaDB的 - http://mariadb.com/

我應該離開表/查詢原樣,還是最好強制使用索引?

+0

這裏的問題是?我在您的內容中看不到任何問號 –

+0

這可能是因爲對於您的查詢,MySQL認爲不使用索引是最好的處理方式。試着強制它使用你認爲應該的索引並比較結果。 – fge

+1

由於您的表中有一個單一條目,因此,mysql估計執行表掃描時索引會掃描您的查詢所需的資源會更少。不要忘記查詢執行計劃正在考慮表中的行數。 – ioan

回答

3

試試這個

EXPLAIN SELECT inline FROM events_self WHERE obj_id = "1"; 

既然你發送的整數,MySQL不會因爲類型不同考慮索引。

+0

哎喲,我從來沒有見過這樣的事情。顯然它現在工作正常。不幸的是obj_id必須是一個varchar(140)。你知道我在哪裏可以閱讀有關Mysql索引的類型問題嗎?謝謝 – sathia

+1

你可以修改你的查詢來發送字符串而不是int。 – Venu

+0

確實:WHERE obj_id = 985591 LIMIT 1 => 1行(0.66秒) WHERE obj_id =「985591」LIMIT 1 => 1行(0.00秒) – sathia