Recuerdo en Oracle que es posible indexar en función de una función, p. SUBSTRING(id,1,8)
.¿Es posible tener un índice basado en función en MySQL?
¿Soporta MySQL esto? Si no, ¿hay alguna alternativa?
Recuerdo en Oracle que es posible indexar en función de una función, p. SUBSTRING(id,1,8)
.¿Es posible tener un índice basado en función en MySQL?
¿Soporta MySQL esto? Si no, ¿hay alguna alternativa?
No, no en un sentido general, yo no creo incluso 5.6 tiene esta funcionalidad. Se es posible utilizar sólo la parte líder de una columna (esta funcionalidad ha sido de alrededor de un largo tiempo), pero no uno a partir de la segunda o posteriores caracteres, o cualquier otra función más compleja.
Por ejemplo, la siguiente crea un índice usando los cinco primeros caracteres de un nombre:
create index name_first_five on cust_table (name(5));
Para expresiones más complejas, se puede lograr un efecto similar al tener otra columna con los datos indexables en y luego usar disparadores de inserción/actualización para asegurar que esté lleno correctamente.
Aparte del desperdicio de espacio para los datos redundantes, que es más o menos lo mismo.
Y, aunque técnicamente infringe 3NF, se mitiga mediante el uso de desencadenantes para mantener los datos sincronizados (esto es algo que a menudo se hace para obtener un mayor rendimiento).
Gracias ... para mi caso solo necesito usar los primeros 8 caracteres de cadena como índice. ¿podría usar: crear el nombre de índice_first_8 en cust_table (name (8)); – user836026
@ user836026: sí, eso debería funcionar. – paxdiablo
@paxdiablo, actualice 5.6 '5.7'. sería genial si agrega una cotización 8.0 en ella. – Adrian
Esto es posible a partir de MySQL 5.7.5 usando la nueva Generated Columns.
MySQL no soporta esto, pero hay una alternativa.
1. Desde MySQL 5.7.6
Se puede usar un auto generada columna para mantener la subcadena con un índice en él:
CREATE TABLE SomeTable (
id CHAR(10),
sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id)
)
Como se ha señalado Benjamin, InnoDB soporta índices secundarios en columnas virtuales para que se pueda omitir la palabra clave ALMACENADA. De hecho, los índices secundarios en columnas virtuales pueden ser preferibles. Más información aquí: Secondary Indexes and Generated Columns
2. Antes de MySQL 5.7.6
Se puede utilizar una columna actualizada por un gatillo con un índice en él:
CREATE TABLE SomeTable (
id CHAR(10),
sub_id CHAR(8) , INDEX(sub_id)
);
CREATE TRIGGER TR_SomeTable_INSERT_sub_id
BEFORE INSERT
ON SomeTable FOR EACH ROW
SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8);
CREATE TRIGGER TR_SomeTable_UPDATE_sub_id
BEFORE UPDATE
ON SomeTable FOR EACH ROW
SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8);
Tenga en cuenta que según la [documentación] (https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html), * InnoDB admite índices secundarios en columnas virtuales *. ¡De modo que puede omitir la palabra clave 'STORED' para hacer que la columna sea virtual, ahorrar espacio de almacenamiento y aún así tener los datos indexados! – Benjamin
Usted quiere decir omitir el primer carácter ? No creo que eso sea posible :) –