Przypominam sobie w Oracle, że możliwe jest indeksowanie na podstawie funkcji, np. SUBSTRING(id,1,8)
.Czy możliwe jest posiadanie indeksu opartego na funkcjach w MySQL?
Czy MySQL obsługuje to? Jeśli nie, czy jest jakaś alternatywa?
Przypominam sobie w Oracle, że możliwe jest indeksowanie na podstawie funkcji, np. SUBSTRING(id,1,8)
.Czy możliwe jest posiadanie indeksu opartego na funkcjach w MySQL?
Czy MySQL obsługuje to? Jeśli nie, czy jest jakaś alternatywa?
Nie, nie w ogólnym sensie, nie wierzę, że nawet 5.6 ma tę funkcję. To jest możliwe, aby używać tylko części kolumny (ta funkcja była dostępna od dłuższego czasu), ale nie zaczyna się od drugiego lub kolejnych znaków, ani żadnej innej bardziej złożonej funkcji.
Na przykład, co następuje tworzy indeks używając pięć pierwszych znaków nazwy:
create index name_first_five on cust_table (name(5));
Dla bardziej złożonych wyrażeń, można osiągnąć podobny efekt poprzez kolejna kolumna z wymiennymi danych w to, a następnie użyj wyzwalaczy wstawiania/aktualizacji, aby upewnić się, że jest poprawnie wypełniony.
Inne niż zmarnowane miejsce na nadmiarowe dane, to prawie to samo.
I choć technicznie narusza 3NF, jest to łagodzone przez użycie wyzwalaczy w celu synchronizacji danych (jest to często wykonywane w celu zwiększenia wydajności).
Dziękuję ... w moim przypadku wystarczy użyć pierwszych 8 znaków łańcucha jako indeksu. czy mogę użyć: stworzyć index name_first_8 na cust_table (name (8)); – user836026
@ user836026: tak, to powinno działać. – paxdiablo
@paxdiablo, zaktualizuj 5.6 '5.7'. byłoby wspaniale, gdyby dodać do niego cytat 8.0. – Adrian
Jest to możliwe od wersji MySQL 5.7.5 z nowym Generated Columns.
MySQL nie obsługuje tego, ale istnieje alternatywa.
1. Ponieważ MySQL 5.7.6
można użyć automatycznie generowane kolumnę trzymać podciąg z indeksem na nim:
CREATE TABLE SomeTable (
id CHAR(10),
sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id)
)
Jak Benjamin zauważyć, InnoDB obsługuje indeksy wtórnych w wirtualnych kolumnach, więc słowo kluczowe ZACHOWANE może zostać pominięte. W rzeczywistości preferowane mogą być indeksy pomocnicze na wirtualnych kolumnach. Więcej informacji tutaj: Secondary Indexes and Generated Columns
2. Przed MySQL 5.7.6
można użyć kolumny zaktualizowane przez wyzwalacz z indeksem na nim:
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);
Należy zauważyć, że zgodnie z [dokumentacją] (https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html), * InnoDB obsługuje indeksy pomocnicze na wirtualnych kolumnach *. Możesz więc pominąć słowo kluczowe 'STORED', aby kolumna była wirtualna, zaoszczędzić trochę miejsca i nadal mieć indeksowane dane! – Benjamin
chodziło Ci pominąć pierwszy znak ? Nie sądzę, że to możliwe :) –