2011-11-16 61 views
4
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; 

我有这些查询:MySQL:如何在布尔/ tinyint列上创建部分索引?

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)。

回答

11

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

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

如果你正在寻找一个性能提升,因为它不能同时使用winprize_id列(虽然我看你目前尚不具备win索引),你可以创造超过(win, prize_id)一个综合指数(按顺序),所以它会首先通过win过滤值,然后查看剩余的prize_id值。

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

+0

关于索引的更大尺寸使用情况,在2011年发布此答案时可能会出现这种情况,但现在情况不再如此。 根据[官方文档](https://dev.mysql.com/doc/refman/5.7/en/create-index.html): '如果列中的名称通常与前10个字符不同该索引不应该比从整个名称列创建的索引慢得多。另外,对索引使用列前缀可以使索引文件更小,这可以节省大量磁盘空间,并且还可以加速INSERT操作。' –

+1

@AbuJunayd我想你会误解。比较是在[不包括每行的索引](https://en.wikipedia.org/wiki/Partial_index)(提问者描述的和MySQL目前不支持的)和覆盖附加列的复合索引之间进行比较。如果提问者试图通过索引行的子集来减少一列的索引大小,那么肯定向索引添加第二列(并且仍然索引所有行)将增加其大小。 – Wiseguy