Вопрос по mysql, indexing – Можно ли иметь функциональный индекс в MySQL?

52

Я помню, что в Oracle можно индексировать на основе функции, например,SUBSTRING(id,1,8).

MySQL поддерживает это? Если нет, есть ли альтернатива?

Вы хотите пропустить первый символ? Я не думаю, что это возможно Ja͢ck

Ваш Ответ

3   ответа
25

1. Начиная с MySQL 5.7.6

Вы можете использовать автоматически сгенерированный столбец для хранения подстроки с индексом:

CREATE TABLE SomeTable (
    id CHAR(10),
    sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id)
)

Как Бенджамин отметил, InnoDB поддерживает вторичные индексы для виртуальных столбцов, поэтому ключевое слово STORED может быть опущено. Фактически вторичные индексы для виртуальных столбцов могут быть предпочтительнее. Больше информации здесь: Вторичные индексы и сгенерированные столбцы

2. До MySQL 5.7.6

Вы можете использовать столбец, обновленный триггером с индексом на нем:

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);
Отметьте, что согласнодокументаци, InnoDB поддерживает вторичные индексы для виртуальных столбцов. Таким образом, вы можете опуститьSTORED ключевое слово, чтобы сделать столбец виртуальным, сэкономить место для хранения и при этом индексировать данные! Benjamin
Обновление: MySQL 8.0 выпущен, но все еще нет собственных выражений SQL или индексов функций. Поэтому вам все еще нужно использовать созданную индексацию столбцов в качестве обходного пути. Raymond Nijland
48

не в общем смысле, я не верю, что даже 5.6 обладает такой функциональностью. Этоявляетс можно использовать только Ведущий часть столбца (эта функция существует уже давно), но не одна, начинающаяся со второго или последующих символов, или любая другая более сложная функция.

Например, следующее создает индекс, используя первые пять символов имени:

create index name_first_five on cust_table (name(5));

Для более сложных выражений вы можете добиться аналогичного эффекта, еслидруго столбец с индексируемыми данными в нем, затем используйте триггеры вставки / обновления, чтобы убедиться, что они заполнены правильно.

Это не то же самое, что потраченное впустую пространство для избыточных данны

И хотя это технически нарушает 3NF, это смягчается использованием триггеров для синхронизации данных (это часто делается для повышения производительности).

@ paxdiablo, пожалуйста, обновите 5.6 '5.7'. было бы здорово, если бы вы добавили цитату 8.0. Anirudha Gupta
Спасибо ... для моего случая мне нужно просто использовать первые 8 символов строки в качестве индекса. Могу ли я использовать: создать индекс name_first_8 на cust_table (name (8)); user836026
@ user836026: да, это должно сработать. paxdiablo
14
Обновление: MySQL 8.0 выпущен, но все еще нет собственных выражений SQL или индексов функций. Поэтому вам все еще нужно использовать созданную индексацию столбцов в качестве обходного пути. Raymond Nijland

Похожие вопросы