我有一个用于记录数据的表,例如
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似乎是一个明显的索引候选者,但是我需要索引频道和类型,因为它们是一组相对较小的可能性吗?
答案 0 :(得分:2)
在这种特殊情况下,当您进行基于user_id
channel
和type
的搜索时,您可以使用覆盖索引(复合),这将是有效的。
如果表有多列索引,则表示最左边的前缀 优化器可以使用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)