MySQL在8.0.13版本引入函数索引的概念,引入函数索引主要解决某些场景下的查询优化问题,下面通过一个例子来解释什么是函数索引以及如何使用函数索引。
先来看一张表app_user,如下所示:
对于这张表,有这样一条SQL,在where条件createdOn字段上使用了函数month:
select*fromapp_userwheremonth(createdOn)=5;
来看一下它的执行计划,从执行计划上来看,并没有走索引。
尝试在createdOn字段上加普通索引:
altertableapp_useraddindexidx_createdon(createdOn);
再来看一下执行计划,还是没有走索引,这也是MySQL一直以来的问题,字段上使用函数,即使该字段上有索引,执行计划也不会使用该索引。
添加函数索引
altertableapp_useraddindexidx_month_createdon((month(createdOn)));
再看一下执行计划,已经可以走索引了:
添加函数索引前,SQL执行耗时5.01秒,加了函数索引后,SQL执行耗时0.29秒,性能提升很高。
函数索引实际上是通过隐藏的虚拟字段来实现的,因此对于一般字段上的限制,在函数索引上也都会有。
函数索引的限制
只有在字段上可以使用的函数才被允许构建函数索引。主键不能被包含在函数索引中。空间索引和全文索引不能包含函数索引。如果要删除的字段上有函数索引,必须先删除函数索引,才能删除字段。