我记得在Oracle中,可以基于函数进行索引,例如SUBSTRING(id,1,8)
。
MySQL是否支持这一点?如果没有,有没有其他选择?
发布于 2015-11-10 08:01:41
从使用新Generated Columns的MySQL 5.7.5开始,这是可能的。
发布于 2019-07-20 13:59:45
可以,我们可以在MySQL中创建函数索引。此功能从MySQL 8.0.13开始可用。(其他关系型数据库在其早期版本中具有此功能,但MySQL在其版本8.0.13中引入了此功能)。Functional Index
这里我给出了一个在MySQL8.0中创建函数索引的示例
这就是查询
SELECT * FROM app_user WHERE month(createdOn) = 5;
mysql> SELECT * FROM app_user WHERE month(createdOn) = 5;
7e9e2b7bc2e9bde15504f6c5658458ab - 74322 rows in set (5.01 sec)
它执行了超过5秒来获取74322条记录,即使我在createdOn列上有索引。(优化器没有使用createdOn列的索引,因为它被month()函数屏蔽了)
现在,我已经使用以下语法在列上创建了一个函数索引。
mysql> ALTER TABLE app_user ADD INDEX
idx_month_createdon((month(createdOn)));
Query OK, 0 rows affected (1 min 17.37 sec) Records: 0 Duplicates: 0
Warnings: 0
mysql> SELECT * FROM app_user WHERE month(createdOn) = 5;
7e9e2b7bc2e9bde15504f6c5658458ab - 74322 rows in set (0.29 sec)
创建函数索引后,它在0.29秒内执行。
在Mysql网站上很难找到函数索引文档,它是以functional key parts为名的
并且我们不能删除具有函数索引的列。要实现这一点,我们首先需要删除函数索引。
mysql> ALTER TABLE app_user DROP COLUMN createdOn;
Cannot drop column 'createdOn' because it is used by a functional
index. In order to drop the column, you must remove the functional
index.
如果您使用的是MySQL > 5.7.5,则可以使用generated columns来实现相同的功能。
https://stackoverflow.com/questions/10595037
复制相似问题