MYSQL为什么不优先使用我创建的组合索引

空白-键 2015-05-15 02:22:15
我在T表上有三个字段,分别是a、b、c,然后在b字段上创建索引idx_b,又创建了组合索引idx_a_b_c。

explain select * from T where a='a' and b='b' and c='c'

发现使用的索引是idx_b,为什么不使用组合索引呢?
...全文
389 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2015-05-18
  • 打赏
  • 举报
回复
表中才6条记录? 记录太少时,MYSQL会认为根本不需要走索引。 建议表中增加记录。然后再试。
空白-键 2015-05-18
  • 打赏
  • 举报
回复
引用 2 楼 ACMAIN_CHM 的回复:
贴出 show index from ...以供分析。

Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment
t_player_activate_list	0	PRIMARY	1	id	A	6	\N	\N		BTREE		
t_player_activate_list	0	idx_playeractivatelist_p_g_c	1	playerCode	A	6	\N	\N		BTREE		
t_player_activate_list	0	idx_playeractivatelist_p_g_c	2	gameCode	A	6	\N	\N		BTREE		
t_player_activate_list	0	idx_playeractivatelist_p_g_c	3	channelCode	A	6	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_gamecode	1	gameCode	A	6	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_channelcode	1	channelCode	A	6	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_c_g_a	1	channelCode	A	6	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_c_g_a	2	gameCode	A	6	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_c_g_a	3	activateTime	A	6	\N	\N		BTREE		
建表SQL:


/*==============================================================*/
/* Table: t_player_activate_list                                */
/*==============================================================*/
create table t_player_activate_list
(
   id                   bigint not null auto_increment comment 'ID',
   playerCode           varchar(64) not null comment '玩家编号',
   gameCode             varchar(64) not null comment '游戏编号',
   activateTime         datetime not null comment '激活时间',
   channelCode          varchar(64) not null comment '渠道编号',
   primary key (id)
);

alter table t_player_activate_list comment '玩家激活记录';

/*==============================================================*/
/* Index: idx_playeractivatelist_gamecode                       */
/*==============================================================*/
create index idx_playeractivatelist_gamecode on t_player_activate_list
(
   gameCode
);

/*==============================================================*/
/* Index: idx_playeractivatelist_p_g_c                          */
/*==============================================================*/
create unique index idx_playeractivatelist_p_g_c on t_player_activate_list
(
   playerCode,
   gameCode,
   channelCode
);

/*==============================================================*/
/* Index: idx_playeractivatelist_channelcode                    */
/*==============================================================*/
create index idx_playeractivatelist_channelcode on t_player_activate_list
(
   channelCode
);

/*==============================================================*/
/* Index: idx_playeractivatelist_c_g_a                          */
/*==============================================================*/
create index idx_playeractivatelist_c_g_a on t_player_activate_list
(
   channelCode,
   gameCode,
   activateTime
);
执行SQL:

explain select * from t_player_activate_list where  channelCode = '1' and gameCode = '1' and activateTime <= now();
执行结果:

id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t_player_activate_list	ref	idx_playeractivatelist_gamecode,idx_playeractivatelist_channelcode,idx_playeractivatelist_c_g_a	idx_playeractivatelist_gamecode	194	const	1	Using where
有点长,不知道这有看你会不会觉得乱,如果觉得乱,我就再重新整理下,看能不能整理的简洁一点
空白-键 2015-05-18
  • 打赏
  • 举报
回复
引用 1 楼 u011575570 的回复:
sql语句where后条件的执行是从右到左,你将b='b'放到最后看下
我试了下,顺序反过来也是一样
空白-键 2015-05-18
  • 打赏
  • 举报
回复
引用 5 楼 ACMAIN_CHM 的回复:
表中才6条记录? 记录太少时,MYSQL会认为根本不需要走索引。 建议表中增加记录。然后再试。
我明白了,是不是因为我测试插入的10W条数据中,随机生成的gameCode字段值都不一样,所以mysql认为用gameCode索引就可以了,没必要用到组合索引,我试着把gameCode改为有重复的,就用到组合索引了
空白-键 2015-05-18
  • 打赏
  • 举报
回复
引用 5 楼 ACMAIN_CHM 的回复:
表中才6条记录? 记录太少时,MYSQL会认为根本不需要走索引。 建议表中增加记录。然后再试。
我往里面插了10W条记录了,还是一样

Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment
t_player_activate_list	0	PRIMARY	1	id	A	100535	\N	\N		BTREE		
t_player_activate_list	0	idx_playeractivatelist_p_g_c	1	playerCode	A	100535	\N	\N		BTREE		
t_player_activate_list	0	idx_playeractivatelist_p_g_c	2	gameCode	A	100535	\N	\N		BTREE		
t_player_activate_list	0	idx_playeractivatelist_p_g_c	3	channelCode	A	100535	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_gamecode	1	gameCode	A	100535	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_channelcode	1	channelCode	A	100535	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_c_g_a	1	channelCode	A	100535	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_c_g_a	2	gameCode	A	100535	\N	\N		BTREE		
t_player_activate_list	1	idx_playeractivatelist_c_g_a	3	activateTime	A	100535	\N	\N		BTREE		
ACMAIN_CHM 2015-05-15
  • 打赏
  • 举报
回复
贴出 show index from ...以供分析。
rick-he 2015-05-15
  • 打赏
  • 举报
回复
sql语句where后条件的执行是从右到左,你将b='b'放到最后看下

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧