RDS性能优化之函数计算
RDS性能优化之避免函数计算
一、先说结论:
MySQL各个版本对函数索引的支持是不一样的;MySQL5.7不支持函数索引,所以在查询条件中加入函数计算,则无法使用到索引;MySQL8.0增加了支持函数索引功能,可以直接使用函数索引。
二、以下是MySQL5.7版本中验证及优化过程:
1、MySQL5.7中新建gu表,为时间字段create_time字段创建索引

不使用日期函数查询的情况下,执行计划查询的type为ref;执行计划如截图下:

而使用了日期函数查询的sql,他的执行计划的type为all,截图如下:

执行计划中可以看出是进行了全面扫描;
可以看出MySQL5.7版本的确不支持函数索引;
2、MySQL5.7版本在必须使用函数查询但是查询效率低下的时候,怎样进行优化呢?
以下是优化过程:

可以看到优化后的查询使用了索引;
三、MySQL8.0的索引特性增加了函数索引。其实MySQL5.7中推出了虚拟列的功能,而MySQL8.0的函数索引也是依据虚拟列来实现的。
1、创建函数索引
在将上述的表及数据在MySQL8.0的实例上创建,然后创建create_time的函数索引,SQL如下
MySQL> alter table tb_function add key idx_create_time((date(create_time))); -- 注意里面字段的括号
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
2、按时间查询
MySQL> select * from tb_function where date(create_time)='2020-07-01';+----+--------------------+---------------------+| id | name | create_time |+----+--------------------+---------------------+| 1 | anniuadaOAIFAPUHIA | 2020-07-01 12:00:00 || 2 | CWQSsar3qcssg | 2020-07-01 15:00:00 || 3 | vxfqrt2adafz | 2020-07-01 21:30:00 |+----+--------------------+---------------------+3 rows in set (0.00 sec)
执行计划如下
MySQL> explain select * from tb_function where date(create_time)='2020-07-01';+----+-------------+-------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------+| 1 | SIMPLE | tb_function | NULL | ref | idx_create_time | idx_create_time | 4 | const | 3 | 100.00 | NULL |+----+-------------+-------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------+1 row in set, 1 warning (0.00 sec
可见,在MySQL8.0 创建对应的函数索引后,不改变SQL写法的前提下,查询的列上进行对应的函数计算后也可以走索引。

浙公网安备 33010602011771号