从MySQL 8.0.13起,开始支持函数索引功能,该功能可以很好的帮助开发人员或者DBA去优先生产环境的SQL语句。通常,我们是并建议在SQL语句的查询条件中对列进行任何的函数计算的,因为这种做很有可能导致原本可以使用索引的查询条件,变得无法使用索引。
例如,我们看如下的查询条件:
SELECT * FROM user_info WHERE substr(id_card_no,1,6) = '330106';
虽然,该表的id_card_no上原本是存在索引的,但是上面的写法则会导致SQL无法正常使用id_card_no列上的索引。一般来说,我们会建议开发人员,避免这种写法,更多的是将表达式放到右侧,如上的SQL则建议修改为:
SELECT * FROM user_info WHERE id_card_no like '330106%';
但某些情况下,我们可能无法修改SQL,例如:
- 有很多的函数计算或表达式操作并不能简单的转换到表达式的右边,例如:
uid%1024 = 7
- 应用程序来自第三方,而我们并不拥有第三方的代码,也无法进行修改SQL
- 生产故障已经由此产生,可能来不及修改线上的代码或SQL
- 还有一个略微“牵强”的说法:SQL语法更加注重解释性,并不关注实现,基于此大原则,上面的SQL写法并没有什么问题。
函数索引使用示例
MySQL的函数索引是8.0版本引入的重要特性之一。它允许开发人员在查询中使用函数,并且依旧可以有效地加速查询性能。具体的,函数索引的作用是通过在函数表达式上创建索引,在处理字符串、日期、数值等类型的数据时特别有用。
(more…)