использование ifnull с созданием индекса в mysql

0

Я пытаюсь создать индекс в MySQL, тогда как запрос сначала проверит, какой столбец не является нулевым. После проверки он создаст индекс в столбце, который не является нулевым. Тем не менее, мне не удается создать это, и он говорит, что у меня ошибка, может кто-то мне помочь? см. мой код ниже

create index IDX_KSE_NO_01 on tb_kse(ifnull(ss_no, id_no);
  • 0
    Какова цель? ORDER BY ISNULL(...) ? Или SELECT ISNULL... ? Или сокращение индекса? Или не отображать те с NULL ?
Теги:
indexing
ifnull

2 ответа

1
Лучший ответ

MySQL не поддерживает функциональный индекс. Вы должны создать нормальный индекс:

create index IDX_KSE_NO_01 on tb_kse(ss_no);
create index IDX_KSE_NO_02 on tb_kse(id_no);

И перепишите свой запрос (OR-Expansion):

SELECT *
FROM tb_kse WHERE ss_no = ?
UNION 
SELECT *
FROM tb_kse
WHERE ss_no IS NULL AND id_no = ?;

Демоверсия DBFiddle


Другой способ - создать созданный столбец и создать индекс поверх него:

CREATE TABLE tb_kse(id_no INT, ss_no INT,
       gen_col INT GENERATED ALWAYS AS (ifnull(ss_no, id_no)) STORED);

create index IDX_KSE_NO_01 on tb_kse(gen_col);

SELECT *
FROM tb_kse
WHERE gen_col = ?;

DBFiddle Demo 2

  • 0
    Два индекса должны быть заменены одним составным индексом: (ss_no, id_no) - такой будет работать для первого SELECT и работать намного эффективнее для второго.
2

@lad2025 верна, что MySQL не поддерживает индексы на основе функций (например, PostgreSQL), но MySQL 5.7 представил функцию для виртуально сгенерированных столбцов на основе выражений, а затем вы можете создать индекс в виртуальном столбце.

ALTER TABLE tb_kse ADD COLUMN either_no VARCHAR(10) AS (IFNULL(ss_no, id_no));
CREATE INDEX IDX_KSE_NO_01 ON tb_kse(either_no);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню