CREATE TABLE participations (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
participant_id int(10) unsigned NOT NULL,
prize_id int(10) unsigned NOT NULL,
win tinyint(1) NOT NULL DEFAULT '0',
-- ...
PRIMARY KEY (id),
INDEX participant_id (participant_id),
INDEX prize_id (prize_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我有这些疑问:
SELECT prize_id, participant_id FROM participations WHERE win=1;
SELECT participant_id FROM participations WHERE prize_id=1 AND win=1;
可以创建一个像(PostgreSQL-style)的部分索引吗?
CREATE UNIQUE INDEX prize_win ON participations (prize_id) WHERE win=1;
__
计划B:有一个表“获胜者”(prize_id,participant_id)。
答案 0 :(得分:11)
不,MySQL不支持这种性质的部分索引。
如果人们在MySQL中引用“部分索引”,则它们指的是文本“前缀索引”,其中只有一定数量的前导字符被索引而不是整个值。例如,索引可以仅通过索引前5个字符来生成。
如果您正在寻找性能提升,因为它没有同时使用win
和prize_id
列(虽然我发现您当前没有win
已编入索引),但您可以创建合并索引超过(win, prize_id)
(按此顺序),以便首先按win
过滤值,然后查看剩余的prize_id
值。
如果您只是为了减少该索引的大小/内存使用而寻找部分索引,那么遗憾的是会产生相反的效果。