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

MySQL: How to create a partial index on a boolean/tinyint column?

提问人:Pascal Polleunus 提问时间:11/17/2011 更新时间:11/17/2011 访问量:5260

问:

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样式)这样的部分索引吗?

CREATE UNIQUE INDEX prize_win ON participations (prize_id) WHERE win=1;

__

B计划:有一个桌子“赢家”(prize_id,participant_id)。

MySQL 索引

评论


答:

12赞 Wiseguy 11/17/2011 #1

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

如果人们在MySQL中提到“部分索引”,他们指的是文本“前缀索引”,其中仅索引一定数量的前导字符,而不是整个值。例如,可以通过仅对前 5 个字符编制索引来建立索引。

如果你正在寻找性能提升,因为它没有同时使用和列(尽管我看到你目前没有索引),你可以创建一个复合索引(按该顺序),以便它首先过滤值,然后查看剩余值。winprize_idwin(win, prize_id)winprize_id

如果您只是为了减少该索引的大小/内存使用量而寻找部分索引,那么不幸的是,这将产生相反的效果。

评论

0赞 Abu Junayd 2/28/2017
关于指数的更大规模使用,在2011年发布此答案时可能是正确的,但情况已不再如此。根据官方文件If names in the column usually differ in the first 10 characters, this index should not be much slower than an index created from the entire name column. Also, using column prefixes for indexes can make the index file much smaller, which could save a lot of disk space and might also speed up INSERT operations.
1赞 Wiseguy 2/28/2017
@AbuJunayd我想你误会了。比较的是不包括每一行的索引(提问者描述的,MySQL当前不支持)和涵盖附加列的复合索引。如果请求者试图通过仅索引一部分行来减小一列索引的大小,那么向索引添加第二列(并且仍然索引所有行)肯定会增加其大小。