为什么我的mysql不使用索引?

时间:2010-10-20 02:40:15

标签: sql mysql indexing

我正在调整我对mysql的查询。 模式具有user_id索引(以下...) 但是没有使用索引。为什么呢?

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

3 个答案:

答案 0 :(得分:1)

我的猜测是typeuser_id不是indexed

只是一个会运行。你玩的不多。

答案 1 :(得分:0)

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

答案 2 :(得分: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)。