首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在MySQL中有没有可能有基于函数的索引?

在MySQL中有没有可能有基于函数的索引?
EN

Stack Overflow用户
提问于 2012-05-15 14:10:16
回答 2查看 44.1K关注 0票数 70

我记得在Oracle中,可以基于函数进行索引,例如SUBSTRING(id,1,8)

MySQL是否支持这一点?如果没有,有没有其他选择?

EN

回答 2

Stack Overflow用户

发布于 2015-11-10 08:01:41

从使用新Generated Columns的MySQL 5.7.5开始,这是可能的。

票数 18
EN

Stack Overflow用户

发布于 2019-07-20 13:59:45

可以,我们可以在MySQL中创建函数索引。此功能从MySQL 8.0.13开始可用。(其他关系型数据库在其早期版本中具有此功能,但MySQL在其版本8.0.13中引入了此功能)。Functional Index

这里我给出了一个在MySQL8.0中创建函数索引的示例

这就是查询

代码语言:javascript
复制
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()函数屏蔽了)

现在,我已经使用以下语法在列上创建了一个函数索引。

代码语言:javascript
复制
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为名的

并且我们不能删除具有函数索引的列。要实现这一点,我们首先需要删除函数索引。

代码语言:javascript
复制
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来实现相同的功能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10595037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档