在MySQL中可以有基于函数的索引吗?
我记得在Oracle中可以基于一个函数进行索引,例如SUBSTRING(id,1,8)
。
MySQL支持这个吗? 如果没有,是否有其他的select?
不,从一般意义上说,我不相信5.6甚至有这个function。 只能使用列的前面部分(这个function已经存在了很长一段时间),但是不能从第二个或后面的字符开始,或者其他更复杂的function。
例如,下面使用名称的前五个字符创build一个索引:
create index name_first_five on cust_table (name(5));
对于更复杂的expression式,可以通过在其中具有可索引数据的另一列来实现类似的效果,然后使用插入/更新触发器来确保其正确填充。
除了冗余数据的浪费空间,这几乎是一回事。
而且,虽然它在技术上违反了3NF,但通过使用触发器来保持数据同步(这通常是为了增加性能)。
MySQL不支持这一点,但有一个select。
1.自从MySQL 5.7.6
您可以使用自动生成的列来保存带有索引的子string:
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);
这是MySQL 5.7.5使用新生成的列的可能性。