匿名用户
MySQL从8.0.13开始支持此功能
https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts
MySQL8.0.13和更高版本支持索引表达式值而不是列或列前缀值的功能关键部分。 使用功能性关键部件可以对不直接存储在表中的值进行索引。 示例:CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
一个具有多个关键部分的索引可以混合非功能性和功能性关键部分。
对于8.0.13之前的版本,有以下备选方案:
1.自MySQL 5.7.6以来
您可以使用自动生成的列来保存子字符串,其中包含索引:CREATE TABLE SomeTable (
id CHAR(10),
sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id)
)
正如Benjamin所指出的,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);