Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如何在boolean/tinyint列上创建部分索引?_Mysql_Indexing - Fatal编程技术网

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

MySQL:如何在boolean/tinyint列上创建部分索引?,mysql,indexing,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),

我有以下疑问:

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;
可以创建一个类似()的部分索引吗

__


方案B:有一个表“winners”(奖品id,参与者id)。

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

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

如果您正在寻找性能提升,因为它没有同时使用
win
prize\u id
列(虽然我看到您目前没有
win
索引),那么您可以在
(win,prize\u id)
(按该顺序)上创建一个复合索引,以便它首先按
win
过滤值,然后查看剩余的
prize\u id


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

关于索引更大的大小使用,在2011年发布此答案时可能是这样,但现在不是这样了。根据:
如果列中的名称在前10个字符中通常不同,则此索引不应比从整个名称列创建的索引慢太多。此外,使用列前缀作为索引可以使索引文件更小,这可以节省大量磁盘空间,还可能加快插入操作。
@AbuJunayd我想你误解了。比较是在(asker描述的和MySQL目前不支持的)和包含附加列的复合索引之间进行的。如果询问者仅通过索引行子集来减少一列上的索引大小,那么向索引添加第二列(仍然索引所有行)肯定会增加其大小。
SELECT prize_id, participant_id FROM participations WHERE win=1;
SELECT participant_id FROM participations WHERE prize_id=1 AND win=1;
CREATE UNIQUE INDEX prize_win ON participations (prize_id) WHERE win=1;