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)。
关于索引的更大尺寸使用情况,在2011年发布此答案时可能会出现这种情况,但现在情况不再如此。 根据[官方文档](https://dev.mysql.com/doc/refman/5.7/en/create-index.html): '如果列中的名称通常与前10个字符不同该索引不应该比从整个名称列创建的索引慢得多。另外,对索引使用列前缀可以使索引文件更小,这可以节省大量磁盘空间,并且还可以加速INSERT操作。' –
@AbuJunayd我想你会误解。比较是在[不包括每行的索引](https://en.wikipedia.org/wiki/Partial_index)(提问者描述的和MySQL目前不支持的)和覆盖附加列的复合索引之间进行比较。如果提问者试图通过索引行的子集来减少一列的索引大小,那么肯定向索引添加第二列(并且仍然索引所有行)将增加其大小。 – Wiseguy