2012-05-15 14 views

Respuesta

46

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).

+0

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

+2

@ user836026: sí, eso debería funcionar. – paxdiablo

+0

@paxdiablo, actualice 5.6 '5.7'. sería genial si agrega una cotización 8.0 en ella. – Adrian

17

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); 
+1

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

Cuestiones relacionadas