MySQL actualmente no admite índices condicionales.
Para lograr lo que está pidiendo (no es que deba hacerlo;)) puede comenzar a crear una tabla auxiliar:
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`)
);
Luego agrega tres disparadores en la tabla principal:
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 ;
Necesitamos delimiter //
porque queremos usar ;
dentro de los disparadores.
De esa manera, la tabla auxiliar contendrá exactamente los ID correspondientes a las filas de la tabla principal que contienen la cadena "ACTIVE", que se actualizarán mediante los desencadenantes.
Para usar eso en un select
, puede usar lo habitual join
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Si la tabla principal ya contiene datos, o si realiza alguna operación externa que cambia los datos de una manera inusual (por ejemplo, fuera de MySQL), puede arreglar la tabla auxiliar con esto:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
Sobre el rendimiento, probablemente tendrá inserciones, actualizaciones y eliminaciones más lentas. Esto puede tener sentido solo si realmente maneja pocos casos en los que la condición deseada es positiva. Incluso de esa manera, probablemente solo probando puede ver si el espacio ahorrado realmente justifica este enfoque (y si realmente está ahorrando espacio).