RDS性能优化之函数计算

RDS性能优化之避免函数计算

 

一、先说结论:

MySQL各个版本对函数索引的支持是不一样的;MySQL5.7不支持函数索引,所以在查询条件中加入函数计算,则无法使用到索引;MySQL8.0增加了支持函数索引功能,可以直接使用函数索引。

二、以下是MySQL5.7版本中验证及优化过程:

1MySQL5.7中新建gu表,为时间字段create_time字段创建索引

 

 

 

 

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

 

 

 

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

 

 

 

 

执行计划中可以看出是进行了全面扫描;

 

可以看出MySQL5.7版本的确不支持函数索引;

 

2MySQL5.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写法的前提下,查询的列上进行对应的函数计算后也可以走索引。

posted @ 2020-12-07 17:22  xxqing  阅读(154)  评论(0)    收藏  举报