MySQL:如何在boolean/tinyint列上创建部分索引?

Pas*_*nus 4 mysql indexing

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;
Run Code Online (Sandbox Code Playgroud)

我有这些疑问:

SELECT prize_id, participant_id FROM participations WHERE win=1;
SELECT participant_id FROM participations WHERE prize_id=1 AND win=1;
Run Code Online (Sandbox Code Playgroud)

可以创建一个像(PostgreSQL风格)的部分索引吗?

CREATE UNIQUE INDEX prize_win ON participations (prize_id) WHERE win=1;
Run Code Online (Sandbox Code Playgroud)

__

计划B:有一个表"赢家"(prize_id,participant_id).

Wis*_*guy 11

不,MySQL不支持这种性质的部分索引.

如果人们在MySQL中引用"部分索引",则它们指的是文本"前缀索引",其中只有一定数量的前导字符被索引而不是整个值.例如,索引可以仅通过索引前5个字符来生成.

如果您正在寻找性能提升,因为它不使用两个win和prize_id列(虽然我看到您当前没有win索引),您可以创建一个复合索引(win, prize_id)(按此顺序),以便它首先过滤值win,然后看剩下的prize_id价值.

如果您只是为了减少该索引的大小/内存使用而寻找部分索引,那么遗憾的是会产生相反的效果.