【译】MySQL 8.0 函数索引

本文介绍了MySQL 8.0开始支持的函数索引功能,解决查询中涉及函数表达式过滤条件时无法使用索引的问题。通过示例展示了如何创建和使用函数索引,以及其在优化查询性能方面的效果。同时,文章讨论了函数索引的限制和适用场景,并提及在MySQL 5.7上如何通过虚拟列模拟类似功能。
摘要由CSDN通过智能技术生成

尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili

前言

与数百个不同的客户打交道时,我经常在查询方面遇到类似的问题。 在尝试优化数据库环境时,一个非常常见的问题是索引使用。 无法使用索引的查询通常是长时间运行的查询,会消耗更多内存或触发更多磁盘 iops。

一个非常常见的情况是查询对涉及某种函数表达式的列使用过滤条件。无法使用该列上的索引。

从 MySQL 8.0.13 开始支持函数索引。在本文中,我将展示它们是什么以及它们是如何工作的。

众所周知的问题

如前所述,关于索引使用的一个非常常见的问题是,当您使用函数表达式作为过滤条件时。

让我们看一个简单的例子。

您有一个名为 products 的表,其中包含产品的详细信息,包括 create_time TIMESTAMP 列。如果您想计算产品在特定月份的平均价格,您可以执行以下操作:

mysql> SELECT AVG(price) FROM products WHERE MONTH(create_time)=10;
+------------+
| AVG(price) |
+------------+
| 202.982582 |
+------------+

查询返回正确的值,但请看一下 EXPLAIN:

mysql> EXPLAIN SELECT AVG(price) FROM products WHERE MONTH(create_time)=10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: products
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 99015
     filtered: 100.00
        Extra: Using where

该查询触发对表的全表扫描。让我们在 create_time 上创建一个索引并再次检查:

mysql> ALTER TABLE products ADD INDEX(create_time);
Query OK, 0 rows affected (0.71 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain SELECT 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值