2010-10-20 41 views
0

我正在调整我的mysql查询。 架构具有USER_ID的索引(以下..) 但不使用索引。为什么?为什么我的mysql不使用索引?

ENV: MySQL4.0.27,MyISAM数据

SQL如下:

SELECT type,SUM(value_a) A, SUM(value_b) B, SUM(value_c) C 
FROM big_record_table 
WHERE user_id='<user_id>' 
GROUP BY type 

解释:

|table |type |possible_keys |key |key_len |ref |rows |Extra| 

|big_record_table| ALL| user_id_key|||| 1059756 |Using where; Using temporary; Using filesort| 

你可以描述细节?

方案如下:

CREATE TABLE `big_record_table` (
`user_id` int(11) NOT NULL default '0', 
`type` enum('type_a','type_b','type_c') NOT NULL default 'type_a', 
`value_a` bigint(20) NOT NULL default '0', 
`value_b` bigint(20) default NULL, 
`value_c` bigint(20) NOT NULL default '0', 
KEY `user_id_key` (`user_id`) 
) TYPE=MyISAM 
+0

你可以张贴'SHOW的输出CREATE TABLE big_record_table'好吗? – 2010-10-20 03:28:38

+0

谢谢回复脱颖而出书面.I've SHOW CREATE TABLE big_record_table – freddiefujiwara 2010-10-20 04:52:09

+0

多少记录已被此查询阅读? – zerkms 2010-10-20 05:05:00

回答

0

首先,我们看不到你的索引声明方式。你能得到表格的转储吗?在PostgreSQL中,你会使用pg_dump,但我不知道如何在MySQL中。你有没有在桌子上做过分析?

+0

谢谢。是的,我已经ANALYZEd – freddiefujiwara 2010-10-20 03:02:10

+0

好,但是桌面布局呢。我不明白你的索引是如何定义的。你在big_record_table上创建了一个索引吗?这个索引究竟是如何创建的? – 2010-10-20 03:04:29

+0

我写过这个方案。你能给我为什么吗?我应该阅读mysql优化器的源代码吗? – freddiefujiwara 2010-10-20 03:09:00

1

我的猜测是typeuser_id不是indexed

只是将运行。你没有太多的玩法。

+0

谢谢你的回复。但我想得到为什么只有user_id不行? – freddiefujiwara 2010-10-20 03:02:49

+0

@ffffff你正在用'type'进行分组。如果你用'user_id'得到了一大堆结果,他们都必须阅读才能找出不同的类型。 – Frankie 2010-10-20 03:11:40

+0

非常感谢!如果你知道列出的文件。我很高兴 – freddiefujiwara 2010-10-20 03:18:38

0

这可能是隐式类型转换阻止索引被使用。您已将user_id定义为int,但在查询中指定了一个字符串。这使MySQL可以选择将查询中的字符串转换为int(这可能不准确) - 或者将数据库中的每个user_id转换为字符串,以便与查询中的字符串进行比较。

简短的回答:尝试在查询

SELECT type,SUM(value_a) A, SUM(value_b) B, SUM(value_c) C 
FROM big_record_table 
WHERE user_id=123 
GROUP BY type 

(其中123替换为正确的用户ID)去除引号。