如何在MySQL中创建上层函数索引
我的JAVA代码使用下面的select语句获取数据。Col_1是一个索引列,但是查看EXPLAIN,我发现这个select语句没有使用索引。若我删除了UPPER函数,它将利用索引,但我不想更改我的java代码如何在MySQL中创建上层函数索引,mysql,sql,database,indexing,Mysql,Sql,Database,Indexing,我的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_版本8.0.1
SELECT *FROM MY_TABLE WHERE UPPER(COL_1) = UPPER(input_value);
在ORACLE中,我们可以使用下面的语句创建函数索引,但下面的索引创建语句在MySQL中不起作用(8.0.12-commercial,innodb_版本8.0.12)
MySQL 8.0.13允许
您还可以通过确保所有值都已规范化并使用触发器使其保持规范化来解决此问题
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);
我认为这样做没有正当的理由
UPPER(COL_1) = UPPER(input_value)
而不是做
COL_1 = input_value
在colu\u 1
上与大小写折叠排序一起使用。这将让=
负责做“正确”的事情。在某些情况下,UPPPER()
可能做了“错误”的事情。(我想到的是德语ß
)
功能索引
这也适用于:
ALTER TABLE MY_TABLE
ADD INDEX ucol_1 ((UPPER(COL_1)));
一定要使用那些额外的括号
(我在Percona 8.0.16的一个小测试中验证了它。)这是否回答了您的问题?您确定您使用的是区分大小写的排序规则吗?我知道这将解决问题,但现在无法为我更改JAVA代码。这就是为什么我在寻找一种方法forward@RUAhmed-这是一个简单的
更改;请参阅我的添加。它是否适用于MySQL 8.0.12商业版、innodb_8.0.12版
COL_1 = input_value
ALTER TABLE MY_TABLE
ADD INDEX ucol_1 ((UPPER(COL_1)));