Как создать верхний функциональный индекс в MySQL - PullRequest
0 голосов
/ 01 апреля 2020

Мой JAVA код использует приведенный ниже оператор выбора для извлечения данных. Col_1 является столбцом индекса, но, глядя на EXPLAIN, я вижу, что этот оператор выбора не использует индекс. Если я удаляю функцию UPPER, она использует индекс, но я не хочу менять мой java код.

SELECT *FROM MY_TABLE WHERE UPPER(COL_1) = UPPER(input_value);

В ORACLE мы можем создать функциональный индекс, используя оператор ниже, но ниже создания индекса оператор не работает в MySQL (8.0.12-коммерческий, innodb_version 8.0.12)

CREATE INDEX MY_INDEX ON MY_TABLE (UPPER(COL_1));

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

MySQL 8.0.13 позволяет индексированные выражения .

create index upper_col1 on my_table ( (upper(col_1)) )

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

update my_table col_1 = upper(col_1);

create trigger normalize_col_1_on_insert
  before insert on my_table
  for each row
begin
  NEW.col_1 = upper(NEW.col_1)
end

create trigger normalize_col_1_on_update
  before update on my_table
  for each row
begin
  NEW.col_1 = upper(NEW.col_1)
end

Тогда не забудьте также нормализовать ваше значение.

SELECT *
FROM MY_TABLE
WHERE COL_1 = UPPER(input_value);
0 голосов
/ 01 апреля 2020

Я не думаю, что есть веская причина для

UPPER(COL_1) = UPPER(input_value)

вместо

COL_1 = input_value

вместе со сворачиванием регистра COLLATION на COL_1. Это позволило бы = позаботиться о том, чтобы поступить правильно. Возможно, есть случаи, когда UPPPER() делает «неправильные» вещи. (Я думаю о таких вещах, как немецкий ß.)

Функциональный индекс

Это также работает:

ALTER TABLE MY_TABLE
    ADD INDEX ucol_1 ((UPPER(COL_1)));

Обязательно используйте эти дополнительные скобки.

(я проверил это на небольшом тесте в Percona 8.0.16.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...