mysql用于小型值集的多个索引

时间:2015-05-29 08:51:49

标签: mysql indexing

我有一个用于记录数据的表,例如

TABLE IF NOT EXISTS `message_log` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`user_id` int(8) unsigned NOT NULL,
`channel` tinyint(8) unsigned NOT NULL DEFAULT '0',
`type` tinyint(4) NOT NULL DEFAULT '0',
`message` varchar(255) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`confirmed` datetime DEFAULT NULL,
PRIMARY KEY (`id`,`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH (user_id)
PARTITIONS 11 */ AUTO_INCREMENT=4569

(注意 - 我知道它应该是InnoDB,但这不是问题)

关于搜索,可以在user_id,user_id和channel,或user_id以及频道和类型上搜索。 user_id可以是任何数字。 频道是1-20。 类型是1-3。

现在user_id似乎是一个明显的索引候选者,但是我需要索引频道和类型,因为它们是一组相对较小的可能性吗?

1 个答案:

答案 0 :(得分:2)

在这种特殊情况下,当您进行基于user_id channeltype的搜索时,您可以使用覆盖索引(复合),这将是有效的。

  

如果表有多列索引,则表示最左边的前缀   优化器可以使用index来查找行。

http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

因此您可以将索引添加为

alter table message_log add index search_idx(user_id,channel,type)