2013-01-17 46 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