返回顶部
首页 > 资讯 > 数据库 >MySQL中的函数索引(Generated Column)及一次SQL优化
  • 817
分享到

MySQL中的函数索引(Generated Column)及一次SQL优化

MySQL中的函数索引(GeneratedColumn)及一次SQL优化 2016-08-19 03:08:25 817人浏览 绘本
摘要

Mysql 中是没有 oracle 的函数索引功能的,把 mysql 的 Generated Column 称为“函数索引”并不准确,但可以和函数索引达到同样的效果,也有人把这个特性称为“衍生列”。 Generated Colum

MySQL中的函数索引(Generated Column)及一次SQL优化

Mysql 中是没有 oracle 的函数索引功能的,把 mysql 的 Generated Column 称为“函数索引”并不准确,但可以和函数索引达到同样的效果,也有人把这个特性称为“衍生列”。

Generated Column 是什么

Generated Column 的值是根据其定义的表达式所计算而来的,下面使用官方文档中的例子做个简单介绍。

有一张表存储直角三角形的三条边长,大家都知道,根据直角三角形的边长公式,斜边的长度可以通过另外两条边长计算得到,这样就可以在表中只存储两条直角边,而斜边通过 Generated Column 定义,创建这张表并插入一条数据:

CREATE TABLE triangle (
  sidea DOUBLE,
  sideb DOUBLE,
  sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
);
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);

sidea 和 sideb 是两条直角边,sidec 是斜边,insert 时只需要插入两条直角边,也就是说 Generated Column 不能人为操作(插入、更新、删除),会自动根据其定义表达式计算得到。

查询这张表:

mysql> SELECT * FROM triangle;
+-------+-------+--------------------+
| sidea | sideb | sidec              |
+-------+-------+--------------------+
|     1 |     1 | 1.4142135623730951 |
|     3 |     4 |                  5 |
|     6 |     8 |                 10 |
+-------+-------+--------------------+

Generated Column 定义语法

Generated Column 的定义语法如下:

col_name data_type [GENERATED ALWAYS] AS (expr)
  [VIRTUAL | STORED] [NOT NULL | NULL]
  [UNIQUE [KEY]] [[PRIMARY] KEY]
  [COMMENT 'string']

关键字“AS”指明了这个字段是衍生的,是 Generated Column,AS 后面就是用以计算的表达式。GENERATED ALWAYS 使定义更明确,可以省略。

VIRTUAL 和 STORED 是 Generated Column 的两种类型,指明该字段的值如何存储:

  • VIRTUAL: Virtual Generated Column 的值不会持久化到磁盘,只保存在数据字典中(表的元数据),每次读取时在 BEFORE 触发器后就会立即计算。
  • STORED:Stored Generated Column 的值会持久化到磁盘上,而不是每次读取时计算。

如果不指明的话,Mysql 会默认以 VIRTUAL 的形式实现,STORED 需要更多的磁盘空间,性能也没有明显的优势,所以一般使用 VIRTUAL。

Generated Column 定义要点

  • 一般情况下,Generated Column 可以使用内置函数及操作符定义。如果给定相同的数据,多次调用会产生相同的结果,这样的定义是明确被允许的。否则,定义会失败,例如使用 NOW()CURRENT_USER()CONNECTioN_ID()的定义会失败。
  • 自定义的函数和存储过程,不允许使用。
  • 变量,例如系统变量、自定义变量等不允许使用。
  • 子查询不允许使用。
  • Generated Column 的定义中可以依赖其他 Generated Column 字段,但所依赖的衍生字段必须定义在它的前面。如果只依赖非衍生字段,则定义顺序没有要求。
  • 自增长 AUTO_INCREMENT 不允许使用。
  • 自增长的列,不能用到 Generated Column 的定义中。
  • 从 MySQL 5.7.10 开始,如果表达式计算导致截断或给函数提供了不正确的输入,则create table语句将终止,并返回DDL操作。

一次SQL优化

通过慢查询日志找到一条慢SQL,执行计划如下:

mysql> EXPLaiN
SELECT
    c.id,
    b.customer_status
FROM
    t_core_customer c
    INNER JOIN t_core_customer_bizinfo b ON c.id = b.customer_id AND b.biz_id = 'maintain' 
WHERE
    REPLACE ( REPLACE ( c.customer_name, '(', '(' ), ')', ')' ) = '天津买斯扣科技有限公司';
+----+-------------+-------+------------+--------+----------------------------------+---------+---------+--------------------------------+---------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys                    | key     | key_len | ref                            | rows    | filtered | Extra       |
+----+-------------+-------+------------+--------+----------------------------------+---------+---------+--------------------------------+---------+----------+-------------+
|  1 | SIMPLE      | b     | NULL       | ALL    | idx_core_customer_bizinfo_cidbid | NULL    | NULL    | NULL                           | 1263918 |    10.00 | Using where |
|  1 | SIMPLE      | c     | NULL       | eq_ref | PRIMARY                          | PRIMARY | 110     | b.customer_id                  |       1 |   100.00 | Using where |
+----+-------------+-------+------------+--------+----------------------------------+---------+---------+--------------------------------+---------+----------+-------------+
2 rows in set (0.05 sec)

客户表中有117万行数据,这条SQL执行耗时4秒多,通过执行计划可以看到,客户表没有走索引而进行全表扫描,customer_name 字段的索引由于 replace 函数没有被利用到。

增加 Generated Column :

ALTER TABLE `t_core_customer` 
ADD COLUMN `customer_name_replaced` varchar(200)  AS (REPLACE(REPLACE(customer_name, '(', '(' ), ')', ')' )); 

创建索引:

ALTER TABLE `t_core_customer` 
ADD INDEX `customer_name_replaced`(`customer_name_replaced`) USING BTREE;

优化后再看执行计划:

mysql> EXPLAIN
SELECT
    c.id,
    b.customer_status
FROM
    t_core_customer c
    INNER JOIN t_core_customer_bizinfo b ON c.id = b.customer_id AND b.biz_id = 'maintain' 
WHERE
    REPLACE ( REPLACE ( c.customer_name, '(', '(' ), ')', ')' ) = '天津买斯扣科技有限公司';
+----+-------------+-------+------------+------+----------------------------------+----------------------------------+---------+-----------------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys                    | key                              | key_len | ref                         | rows | filtered | Extra |
+----+-------------+-------+------------+------+----------------------------------+----------------------------------+---------+-----------------------------+------+----------+-------+
|  1 | SIMPLE      | c     | NULL       | ref  | PRIMARY,customer_name_replaced   | customer_name_replaced           | 603     | const                       |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | b     | NULL       | ref  | idx_core_customer_bizinfo_cidbid | idx_core_customer_bizinfo_cidbid | 222     | c.id,const                  |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+----------------------------------+----------------------------------+---------+-----------------------------+------+----------+-------+
2 rows in set (0.40 sec)

执行计划正常,利用了索引,SQL耗时到了10毫秒以内。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的函数索引(Generated Column)及一次SQL优化

本文链接: https://lsjlt.com/news/4829.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL中的函数索引(Generated Column)及一次SQL优化
    MySQL 中是没有 Oracle 的函数索引功能的,把 MySQL 的 Generated Column 称为“函数索引”并不准确,但可以和函数索引达到同样的效果,也有人把这个特性称为“衍生列”。 Generated Colum...
    99+
    2016-08-19
    MySQL中的函数索引(Generated Column)及一次SQL优化
  • 高效的SQL(函数索引优化VIEW一例)
    高效的SQL(函数索引优化VIEW一例) 原创                     O...
    99+
    2024-04-02
  • MySQL数据库SQL及索引优化的方法
    MySQL数据库SQL及索引优化的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!     ...
    99+
    2024-04-02
  • MySQL 函数索引的优化方案
    很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下。针对此种情况本文从MySQL5.7 及MySQL8.0中分别进行不同方式的优化。 1、 MySQL5.7 ...
    99+
    2022-05-18
    MySQL 索引 MySQL 函数索引 MySQL 函数索引优化
  • 记一次MySQL字符串索引优化方案
    本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: ①. 直接对整个字符串建立索引 alt...
    99+
    2017-06-13
    记一次MySQL字符串索引优化方案 数据库入门 数据库基础教程 数据库 mysql
  • MySQL中怎么使用Generated Columns + index代替函数索引
    这篇文章主要讲解了“MySQL中怎么使用Generated Columns + index代替函数索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQ...
    99+
    2024-04-02
  • MySQL优化及索引的方法
    这篇“MySQL优化及索引的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL优化及索引的方法”文章吧。索引简单介...
    99+
    2023-06-29
  • SQL索引以及数据库优化是怎样的
    这篇文章给大家介绍SQL索引以及数据库优化是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。(一)深入浅出理解索引结构实际上,您可以把索引理解为一种特殊的目录。微软的SQL SER...
    99+
    2024-04-02
  • SQL优化案例-自定义函数索引(五)
    SQL 文本如下,表本身很小,走全表扫描也很快,但因业务重要性,要求尽可能缩短查询时间(为保证客户隐私,已经将注释和文字部分去掉): SELECT MERCHCODE&nbs...
    99+
    2024-04-02
  • MySQL数据库索引及优化的示例详解
    目录一、mysql 索引简介二、索引优化实战三、总结在日常的数据库使用过程中,我们经常需要对数据进行查询、插入、删除等操作。为了提高这些操作的效率,数据库的性能优化显得尤为重要。本文将带你深入了解 MySQL 数据库的索...
    99+
    2023-05-19
    MySQL索引优化方式 MySQL索引 MySQL优化
  • MySQL中Order By索引的优化
    本篇内容介绍了“MySQL中Order By索引的优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 在...
    99+
    2024-04-02
  • MySQL中的索引如何优化
    这篇文章主要介绍了MySQL中的索引如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中的索引如何优化文章都会有所收获,下面我们一起来看看吧。使用索引优化索引是数...
    99+
    2023-03-01
    mysql
  • MySQL数据库索引原理及优化策略
    目录1 索引索引概念索引作用索引的使用场景2 索引分类B树索引和B+树索引区别3 索引操作创建主键索引唯一索引的创建普通索引的创建查询索引删除索引索引创建原则1 索引 索引概念 索引是一种特殊的文件,包含着对数据表里所有...
    99+
    2023-04-27
    MySQL数据库索引 MySQL数据库索引操作
  • 如何优化 Java 中的索引函数使用?
    Java中的索引函数是一种非常有用的工具,可以帮助开发人员更快速地访问和操作数据。但是,如果不正确使用索引函数,它可能会导致性能问题。在本文中,我们将探讨如何优化Java中的索引函数使用。 索引函数是什么? 在Java中,索引函数是一种...
    99+
    2023-09-02
    索引 函数 api
  • MySQL中SQL优化、索引优化、锁机制、主从复制的方法
    这篇文章主要讲解了“MySQL中SQL优化、索引优化、锁机制、主从复制的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中SQL优化、索引优化、...
    99+
    2024-04-02
  • PHP与MySQL索引的原理及优化方法
    引言:在开发和维护一个功能强大的数据库应用程序时,索引是一个重要的概念,它可以显著提高数据库查询的效率。本文将介绍PHP与MySQL索引的原理和优化方法,并提供一些具体的代码示例。一、索引的原理索引是一种数据结构,它可以帮助数据库引擎快速定...
    99+
    2023-10-21
    PHP 优化方法 MySQL索引
  • MySQL索引及优化的知识点有哪些
    这篇文章主要介绍“MySQL索引及优化的知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL索引及优化的知识点有哪些”文章能帮助大家解决问题。索引是...
    99+
    2023-04-06
    mysql
  • MySQL中的索引优化技巧详解
    MySQL是一个开源的关系型数据库管理系统,被广泛应用于各种网站和应用程序中。索引是MySQL中关键的性能优化手段之一,对于大型数据表来说尤为重要。本文将介绍MySQL中的索引优化技巧,并附加相应的代码示例。一、什么是索引索引是一种特殊的数...
    99+
    2023-10-22
    技巧 优化 索引
  • 怎么进行MySQL性能优化中的索引优化
    本篇文章为大家展示了怎么进行MySQL性能优化中的索引优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引...
    99+
    2024-04-02
  • PL/SQL中的索引怎么设计与优化
    在 PL/SQL 中,索引的设计和优化是非常重要的,可以提高数据库查询的性能。以下是一些关于索引设计与优化的建议: 设计合适的索...
    99+
    2024-05-08
    PL/SQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作