2011-11-16 89 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