MySQL: как создать частичный индекс для столбца типа boolean / tinyint? - PullRequest
4 голосов
/ 16 ноября 2011
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;

__

План Б: Наличие таблицы "победители" (приз_ид, участник_ид).

1 Ответ

11 голосов
/ 16 ноября 2011

Нет, MySQL не поддерживает частичные индексы такого типа.

Если люди ссылаются на «частичные индексы» в MySQL, они ссылаются на текстовые «префиксные индексы», где индексируется только определенное количество начальных символов, а не все значение. Например, индекс может быть создан только путем индексации первых 5 символов.

Если вы ищете повышение производительности, потому что в нем не используются столбцы win и prize_id (хотя я вижу, что у вас в настоящее время нет индекса win), вы можете создать составной индекс более (win, prize_id) (в таком порядке), чтобы сначала отфильтровать значения по win, а затем посмотреть на оставшееся prize_id значение.

Если вместо этого вы ищете частичный индекс просто с целью уменьшения размера / использования памяти этим индексом, это, к сожалению, будет иметь обратный эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...