【问题标题】:How to create UPPER functional index in MySQL如何在 MySQL 中创建 UPPER 功能索引
【发布时间】:2020-04-01 06:44:12
【问题描述】:

我的 JAVA 代码使用下面的 select 语句来获取数据。 Col_1 是一个索引列,但查看 EXPLAIN,我看到这个 select 语句没有使用索引。如果我删除 UPPER 函数,它正在使用索引,但我不想更改我的 java 代码。

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

在 ORACLE 中,我们可以使用以下语句创建功能索引,但以下索引创建语句在 MySQL 中不起作用(8.0.12-commercial ,innodb_version 8.0.12)

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

【问题讨论】:

标签: mysql sql database indexing


【解决方案1】:

MySQL 8.0.13 允许indexed expressions

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

【讨论】:

    【解决方案2】:

    我认为没有正当理由这样做

    UPPER(COL_1) = UPPER(input_value)
    

    而不是做

    COL_1 = input_value
    

    COL_1 上的外壳折叠COLLATION 一起。这会让= 负责做“正确”的事情。在某些情况下,UPPPER() 可能会做“错误”的事情。 (我在想像德国人ß这样的东西。)

    功能索引

    这也有效:

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

    请务必使用这些额外的括号。

    (我在 Percona 8.0.16 的一个小测试中验证了它。)

    【讨论】:

    • 我知道这会解决问题,但现在无法为我更改 JAVA 代码。这就是为什么我一直在寻找前进的道路
    • @RUAhmed - 这是一个简单的ALTER;看我的补充。
    • 它能在 MySQL 8.0.12-commercial , innodb_version 8.0.12 上工作
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2014-06-28
    相关资源
    最近更新 更多