На даний момент MySQL не підтримує умовні індекси.
Щоб домогтися того, що ви просите (не те, щоб ви це робили;)), ви можете почати створювати допоміжну таблицю:
CREATE TABLE `my_schema`.`auxiliary_table` (
`id` int unsigned NOT NULL,
`name` varchar(250), /* specify the same way as in your main table */
PRIMARY KEY (`id`),
KEY `name` (`name`)
);
Потім ви додаєте три тригери в головну таблицю:
delimiter //
CREATE TRIGGER example_insert AFTER INSERT ON main_table
FOR EACH ROW
BEGIN
IF NEW.status = 'ACTIVE' THEN
REPLACE auxiliary_table SET
auxiliary_table.id = NEW.id,
auxiliary_table.name = NEW.name;
END IF;
END;//
CREATE TRIGGER example_update AFTER UPDATE ON main_table
FOR EACH ROW
BEGIN
IF NEW.status = 'ACTIVE' THEN
REPLACE auxiliary_table SET
auxiliary_table.id = NEW.id,
auxiliary_table.name = NEW.name;
ELSE
DELETE FROM auxiliary_table WHERE auxiliary_table.id = OLD.id;
END IF;
END;//
CREATE TRIGGER example_delete AFTER DELETE ON main_table
FOR EACH ROW
BEGIN
DELETE FROM auxiliary_table WHERE auxiliary_table.id = OLD.id;
END;//
delimiter ;
Нам потрібно, delimiter //
тому що ми хочемо використовувати ;
всередині тригерів.
Таким чином, допоміжна таблиця буде містити саме ідентифікатори, що відповідають основним рядкам таблиці, що містять рядок "АКТИВНО", що оновлюється тригерами.
Щоб використовувати це на a select
, ви можете використовувати звичайні join
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Якщо основна таблиця вже містить дані, або якщо ви зробите якусь зовнішню операцію, яка змінює дані незвичним чином (EG: за межами MySQL), ви можете виправити допоміжну таблицю за допомогою цього:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
Щодо продуктивності, ймовірно, у вас будуть повільніші вставки, оновлення та видалення. Це може мати певний сенс, лише якщо ви дійсно маєте справу з кількома випадками, коли бажаний стан є позитивним. Навіть таким чином, мабуть, лише тестуючи, ви зможете побачити, чи збережений простір справді виправдовує цей підхід (і якщо ви дійсно економите будь-який простір взагалі).