• MySQL 8.0:性能优化与新功能


    引言


    MySQL 8.0是MySQL数据库管理系统的最新主要版本,带来了许多性能优化和新功能。本博客将探讨MySQL 8.0的性能提升以及一些使用技巧,助力你更好地利用这一强大的数据库系统。

    新特性概览


    MySQL 8.0相对于先前版本(如MySQL 5.7及更早版本)带来了一系列的显著改进,包括新功能引入、性能提升、安全性增强等方面。以下是MySQL 8.0的一些主要改进:

    1. 窗口函数和通用表达式 (CTE)
    2. JSON 支持的增强
    3. 数据字典的引入
    4. 查询执行计划的改进
    5. InnoDB 存储引擎的改进
    6. 自适应哈希索引
    7. 并发控制的改进
    8. 全文搜索引擎 InnoDB
    9. 加密选项的增强
    10. 用户认证与权限管理的改进

    新功能引入


    窗口函数和通用表达式 (CTE)

    窗口函数和通用表达式(CTE)是MySQL 8.0引入的两个重要的查询功能,它们提供了更灵活和强大的数据处理和分析工具。下面分别介绍它们的使用方法:

    1.窗口函数的使用

    窗口函数允许在查询结果集内执行计算,而不需要对整个表进行汇总。它通常与OVER子句结合使用,以定义窗口范围。以下是一个简单的窗口函数的例子:

    1. SELECT
    2. employee_id,
    3. salary,
    4. AVG(salary) OVER (PARTITION BY department_id) AS avg_salary
    5. FROM
    6. employees;

    在这个例子中,AVG(salary) OVER (PARTITION BY department_id)是一个窗口函数,它计算每个部门的平均工资,PARTITION BY子句定义了窗口的分区,即计算平均值的范围。

    常见的窗口函数包括:

    • ROW_NUMBER():返回每行的排名。
    • RANK():返回排名,并在并列项之间跳过相同排名。
    • DENSE_RANK():返回排名,并在并列项之间跳过相同排名。
    • SUM(),AVG(),MIN(),MAX():聚合函数可以用于窗口。
    2.通用表达式(CTE)的使用

    通用表达式是一种创建可重用临时结果集的方式,通过WITH语句定义。CTE可以在查询中引用,提高了查询的可读性和维护性。以下是一个简单的CTE的例子:

    1. WITH department_avg AS (
    2. SELECT
    3. department_id,
    4. AVG(salary) AS avg_salary
    5. FROM
    6. employees
    7. GROUP BY
    8. department_id
    9. )
    10. SELECT
    11. e.employee_id,
    12. e.salary,
    13. d.avg_salary
    14. FROM
    15. employees e
    16. JOIN
    17. department_avg d ON e.department_id = d.department_id;

    在这个例子中,WITH department_avg AS (...) 定义了一个CTE,它计算每个部门的平均工资。然后,我们在主查询中引用了这个CTE,通过JOIN将结果集与员工表关联。

    CTE的主要优势在于它可以在一个查询中定义,然后在同一查询中多次引用,从而避免了嵌套子查询,提高了查询的可读性。


    JSON 支持的增强

    MySQL 8.0引入了对JSON的增强支持,包括新的JSON函数和对JSON路径表达式的改进。下面介绍一些常见的JSON功能以及它们的使用方法:

    1.JSON函数
    • JSON_TABLE 函数用于将JSON数据转换为关系型数据,生成表格形式的输出。

    示例:

    1. SELECT *
    2. FROM my_table,
    3. JSON_TABLE(json_column, '$.items[*]' COLUMNS (
    4. item_id INT PATH '$.id',
    5. item_name VARCHAR(50) PATH '$.name'
    6. )) AS jt;

    • JSON_ARRAYAGG 函数用于将行聚合为JSON数组。

    示例:

    1. SELECT department, JSON_ARRAYAGG(employee) AS employees
    2. FROM employees
    3. GROUP BY department;

    • JSON_OBJECT 函数用于将键值对转换为JSON对象。

    示例:

    1. SELECT JSON_OBJECT('id', id, 'name', name) AS employee_json
    2. FROM employees;

    2. JSON 路径表达式:
    • ->->> 运算符:
      • -> 运算符用于访问JSON对象的属性,返回JSON对象或数组。
      • ->> 运算符用于访问JSON对象的属性,但返回文本而不是JSON对象。

    示例:

    1. SELECT json_column->'$.name' AS name,
    2. json_column->>'$.age' AS age
    3. FROM my_table;

    • JSON_SEARCH 函数用于查找JSON数据中的指定值,并返回对应的JSON路径。

    示例:

    1. SELECT JSON_SEARCH(json_column, 'one', 'John') AS path
    2. FROM my_table;

    • JSON_MODIFY 函数用于在JSON数据中进行插入、更新或删除操作。

    示例:

    1. UPDATE my_table
    2. SET json_column = JSON_MODIFY(json_column, '$.age', 30)
    3. WHERE id = 1;


    数据字典的引入

    MySQL 8.0引入了数据字典,作为一个中心化的存储系统,用于存储和管理数据库的元数据。数据字典提供了一致的元数据视图,包括表、列、索引、存储过程、触发器等对象的信息。以下是一些关于MySQL 8.0数据字典的使用方法:

    1.查询表信息
    • 查看所有表:
    1. SELECT table_name, table_type
    2. FROM information_schema.tables
    3. WHERE table_schema = 'your_database';
    • 查看表的列信息:
    1. SELECT table_name, column_name, data_type
    2. FROM information_schema.columns
    3. WHERE table_schema = 'your_database';
    2.查看索引信息
    • 查看表的索引:
    1. SELECT table_name, index_name, index_type
    2. FROM information_schema.statistics
    3. WHERE table_schema = 'your_database';
    • 查看索引列信息:
    1. SELECT table_name, index_name, column_name
    2. FROM information_schema.statistics
    3. WHERE table_schema = 'your_database';
    3.查看存储过程和触发器信息:
    • 查看存储过程:
    1. SELECT routine_name, routine_type
    2. FROM information_schema.routines
    3. WHERE routine_schema = 'your_database';
    • 查看触发器:
    1. SELECT trigger_name, event_object_table
    2. FROM information_schema.triggers
    3. WHERE trigger_schema = 'your_database';
    4.查看其他对象信息:
    • 查看视图信息:
    1. SELECT table_name, view_definition
    2. FROM information_schema.views
    3. WHERE table_schema = 'your_database';
    • 查看事件信息:
    1. SELECT event_name, event_definition
    2. FROM information_schema.events
    3. WHERE event_schema = 'your_database';
    5.注意事项:
    • 表名称大小写敏感: 在MySQL中,表名称是大小写敏感的。因此,请确保在查询时使用正确的大小写。
    • 权限: 查询数据字典需要相应的权限。确保用户具有SELECT权限来访问information_schema数据库。

    性能优化


    查询执行计划的改进

    MySQL 8.0对查询执行计划进行了改进,引入了一些新特性和优化,以提高查询执行的效率。以下是一些主要的改进和相关信息:

    1.Cost Model的引入:

    MySQL 8.0引入了 Cost Model优化器,用于评估和选择执行计划的成本模型。Cost Model 考虑了不同执行计划的成本,并根据估算的成本选择最优的执行路径。

    优势:

    • 通过更智能的成本估算,MySQL 8.0能够更准确地选择最优的执行计划。
    • 优化器可以更好地适应查询的复杂性和数据分布,提高查询性能。
    2.索引选择的改进:
    • 自适应哈希索引:引入了自适应哈希索引,用于加速等值查询。动态调整哈希索引以适应查询模式和数据分布,提高了查询性能。
    • 离散数据分布的优化:MySQL 8.0优化了处理离散数据分布的能力,更好地利用索引进行查询。
    3.字符串查询的性能提升:
    • utf8mb4 字符集的性能改进:MySQL 8.0在 utf8mb4 字符集的查询性能上进行了优化,特别是在排序和范围查询方面。
    4.统计信息的改进:
    • 直方图和统计信息的优化:MySQL 8.0引入了直方图和统计信息的优化,帮助优化器更好地理解数据分布,提高对范围查询和不等值查询的优化效果。
    5.适用场景和提升效率:
    • 适用场景:这些改进特别适用于大型数据库和复杂查询场景,其中成本估算的准确性对性能至关重要。
    • 提升效率:具体的性能提升取决于查询的复杂性、数据分布以及数据库的具体配置。在某些场景下,这些改进可以显著提高查询性能。

    InnoDB存储引擎的改进

    MySQL 8.0对InnoDB存储引擎进行了多方面的改进,主要涉及到表空间管理和多版本并发控制(MVCC)的性能优化。以下是对这些改进的深入探讨:

    1.表空间管理的改进:
    • 系统表空间和共享表空间的优化:MySQL 8.0对系统表空间和共享表空间进行了优化,提高了表空间的管理效率。
    • InnoDB 数据字典表的存储方式优化:数据字典表(如SYS_TABLESSYS_COLUMNS等)的存储方式进行了优化,减少了元数据的存储空间和访问成本。
    2.多版本并发控制(MVCC)的性能优化:
    • 新的Read-View的管理:引入了新的Read-View的管理机制,提高了MVCC的效率。Read-View用于读取一致性快照,以支持读取未提交的事务和避免阻塞。
    • Read-View 的并发性优化:优化了多个事务同时使用Read-View的场景,提高了并发性能。
    • Purge 线程的优化:改进了Purge线程的执行方式,加速了对过期版本的清理,提高了系统的稳定性。
    3.空间表的支持:
    • 支持空间数据类型:MySQL 8.0引入了对空间数据类型(如PointLineString等)的支持,使得InnoDB存储引擎更适合处理地理信息和GIS应用。
    4.性能提升的具体效果:

    这些改进使得InnoDB存储引擎在以下方面获得性能提升:

    • 并发性能: 优化了MVCC机制,提高了并发读取的性能,特别是在高并发事务环境下。
    • 事务处理和回滚: 表空间管理的优化以及Undo表空间和Redo日志的改进,加速了事务处理和回滚的性能。
    • 元数据查询: 数据字典表的存储方式优化,减少了元数据查询的成本。

    自适应哈希索引

    自适应哈希索引是MySQL 8.0引入的一个重要特性,用于优化等值查询的性能。它通过动态调整哈希索引以适应查询模式和数据分布的变化,从而提高查询性能。以下是自适应哈希索引的原理和如何利用它提高查询性能的介绍:

    1.自适应哈希索引的原理:
    哈希索引简介:

    哈希索引是一种在内存中维护的数据结构,通过使用哈希函数将键值映射到索引位置,以实现快速的等值查询。哈希索引通常对于等值查询非常高效,但在范围查询和排序等操作上可能性能不如B树索引。

    动态调整哈希索引:

    自适应哈希索引的关键在于其能够动态调整索引结构。当系统检测到某个查询模式频繁使用哈希索引时,自适应哈希索引会相应地调整索引结构以提高性能。

    2. 如何利用自适应哈希索引提高查询性能:
    在适用场景使用哈希索引:
    • 自适应哈希索引特别适用于等值查询的场景,例如WHERE column = value。在这种情况下,MySQL会根据查询模式和数据分布自动选择是否使用哈希索引。
    监控自适应哈希索引性能:
    • 可以通过MySQL的性能监控工具来监控自适应哈希索引的性能。例如,通过查看性能模式(Performance Schema)的相关表来获取有关哈希索引的信息。
    适时分析和调整:
    • 定期分析查询性能和哈希索引的使用情况。如果发现哈希索引在某些查询模式下性能表现良好,可以进一步利用它。如果发现性能下降,可能需要考虑调整索引结构或者考虑其他索引类型。
    3.示例:

    假设有一个表users,其中有一个列username,我们希望查询特定的用户名。自适应哈希索引可以在以下情况下发挥作用:

    1. -- 创建表,MySQL 8.0 会自动检测并选择是否使用哈希索引
    2. CREATE TABLE users (
    3. id INT PRIMARY KEY,
    4. username VARCHAR(255)
    5. );
    6. -- 查询
    7. SELECT * FROM users WHERE username = 'john_doe';

    在这个例子中,如果MySQL检测到username列的等值查询频繁发生,它可能会选择自适应哈希索引来提高查询性能。


    并发控制的改进

    MySQL 8.0在并发控制方面进行了一些重要的改进,旨在提高事务隔离性和系统的并发性能。以下是MySQL 8.0中对并发控制的改进,包括事务隔离级别的优化:

    1.Read-View 的并发性优化:
    • 引入了新的Read-View管理机制,提高了并发读取的性能。多个事务可以同时使用Read-View,从而降低了在高并发环境下的竞争。
    2.InnoDB 读事务的性能优化:
    • 优化了InnoDB的读事务,使其在Read-Committed和Repeatable-Read隔离级别下的性能更好。这包括更有效地管理Read-View和减少锁竞争。
    3.Consistent Snapshot Reads:
    • 引入了Consistent Snapshot Reads,这是一种针对InnoDB存储引擎的优化,提高了在某些情况下的事务读取性能。
    4.其他并发控制方面的改进:
    • InnoDB事务的锁分离:对InnoDB事务的锁分离进行了优化,降低了事务间的锁竞争,提高了并发性能。
    • Purge 线程的优化:改进了Purge线程的执行方式,加速了对过期版本的清理,提高了系统的稳定性。
    • InnoDB 死锁检测的优化:优化了InnoDB的死锁检测机制,减少了死锁检测的开销,提高了系统在并发环境下的稳定性。
    5. 性能提升的具体效果:
    • 这些改进使得MySQL 8.0在处理大量并发事务时具有更好的性能表现,尤其是在高并发读取的情况下。
    • 优化了事务隔离级别下的读事务性能,降低了锁的争用,提高了并发性。
    • Consistent Snapshot Reads的引入为一致性快照读取提供了更高的效率,尤其在读取大量数据时性能更为显著。

    这些改进使得MySQL 8.0在处理复杂事务和高并发环境下更加健壮,提高了数据库的整体性能和可靠性。在实际应用中,开发者可以通过监控和性能测试来评估这些改进对特定工作负载的影响,以更好地利用MySQL 8.0带来的性能优势。


    全文搜索引擎InnoDB

    MySQL 8.0引入了InnoDB全文搜索引擎,使得在InnoDB存储引擎上的表上实现全文搜索功能成为可能。以下是InnoDB全文搜索引擎的使用方法和如何实现全文搜索功能的介绍:

    1. 使用方法:

    创建全文索引:在InnoDB表上创建全文索引,可以使用FULLTEXT索引类型。

    1. CREATE TABLE my_table (
    2. id INT PRIMARY KEY,
    3. content TEXT,
    4. FULLTEXT (content)
    5. ) ENGINE=InnoDB;

    执行全文搜索查询:使用MATCH AGAINST语句执行全文搜索查询。

    1. SELECT * FROM my_table
    2. WHERE MATCH(content) AGAINST('search term');

    全文搜索函数:使用全文搜索函数进行更高级的全文搜索。

    1. SELECT * FROM my_table
    2. WHERE MATCH(content) AGAINST('search term' IN BOOLEAN MODE);
    2.全文搜索功能的实现:
    • 创建表时定义全文索引:在创建表时,通过使用FULLTEXT索引类型为表的某个列定义全文索引。
    • 使用MATCH AGAINST进行全文搜索:使用MATCHAGAINST语句执行全文搜索。这允许你指定搜索的列和搜索的词语。
    • BOOLEAN MODE:使用BOOLEAN MODE进行更高级的全文搜索,支持布尔运算符、通配符和其他高级搜索语法。
    • 调整全文搜索配置:MySQL提供了一些系统变量,如ft_min_word_leninnodb_ft_sort_pll_degree,可以用于调整全文搜索的配置。
    3.示例:
    1. -- 创建表并定义全文索引
    2. CREATE TABLE articles (
    3. id INT PRIMARY KEY,
    4. title VARCHAR(255),
    5. content TEXT,
    6. FULLTEXT (title, content)
    7. ) ENGINE=InnoDB;
    8. -- 执行全文搜索查询
    9. SELECT * FROM articles
    10. WHERE MATCH(title, content) AGAINST('MySQL' IN BOOLEAN MODE);

    在这个例子中,表articles包含titlecontent列,通过FULLTEXT索引定义了全文索引。查询使用MATCH AGAINST语句执行全文搜索,可以指定要搜索的列和搜索的词语,并可以使用BOOLEAN MODE进行更高级的搜索。


    安全性与最佳实践


    加密选项的增强

    MySQL 8.0引入了一些新的加密选项,以进一步加强数据库的安全性。这些加密选项涵盖了数据的传输、存储和用户认证等方面。以下是MySQL 8.0中提供的一些新的加密选项:

    1. 传输层加密:

    MySQL Enterprise TDE(Transparent Data Encryption):

    • MySQL Enterprise Edition提供了Transparent Data Encryption(透明数据加密)功能,用于加密在磁盘上存储的表空间数据,确保数据在磁盘上的存储是加密的。
    2. 加密算法的增强:

    新的加密插件:

    • MySQL 8.0引入了新的加密插件,如caching_sha2_password插件,用于改进用户认证的安全性。这是默认的认证插件,支持SHA-256算法,提供更强的密码安全性。

    SHA-256 和 SHA-2 加密:

    • MySQL 8.0支持SHA-256算法,用于加密用户密码。这提高了密码哈希的安全性,与之前版本的MySQL中的SHA-1相比更为强大。
    3. SSL/TLS 支持的增强:

    支持 OpenSSL 1.1:

    • MySQL 8.0支持OpenSSL 1.1,提供了更先进的SSL/TLS加密支持。

    X509 证书认证:

    • MySQL 8.0增强了SSL/TLS支持,包括对X509证书认证的更好支持。这可以提高连接的安全性。
    4. 用户认证和权限管理的改进:

    密码过期策略:

    • 引入了密码过期策略,可以要求用户在一定时间后更改密码,提高了密码的定期更新。

    强化的角色管理:

    • 引入了更灵活和强大的角色管理,使得用户权限的管理更加细粒度。
    5. Audit Log 插件:

    审计日志插件:

    • MySQL 8.0引入了审计日志插件,允许管理员记录数据库服务器的活动,包括连接、查询、错误等,以加强对数据库安全性的监控。

    用户认证与权限管理


    MySQL 8.0对用户认证和权限管理进行了一系列改进,以提高数据库的安全性。以下是MySQL 8.0中改进的用户认证和权限管理机制的主要特点:

    1. 新的加密插件和密码管理:

    caching_sha2_password 插件:

    MySQL 8.0引入了新的默认加密插件 caching_sha2_password,该插件使用SHA-256算法进行密码加密,提供更强大的安全性。与之前的mysql_native_password插件相比,提供了更好的密码存储和传输安全性。

    b. 密码过期策略:

    MySQL 8.0引入了密码过期策略,允许管理员设置密码的过期时间,从而强制用户定期更改密码,增加了数据库的安全性。

    2. 角色管理的改进:

    更灵活的角色授权:

    MySQL 8.0引入了更灵活的角色管理机制,允许管理员创建和管理角色,通过角色对用户进行权限授权。这提高了权限管理的细粒度。

    默认角色:

    引入了默认角色的概念,用户登录时可以自动关联到一个或多个默认角色,简化了权限管理。

    3. 用户账户管理:

    REQUIRE ISSUER 选项:

    新增了 REQUIRE ISSUER 选项,可用于限制连接的用户证书必须由特定的证书颁发者(Issuer)签发,增强了SSL/TLS证书认证的安全性。

    强化的账户锁定机制:

    引入了更强大的账户锁定机制,支持失败登录尝试次数和锁定时长的配置,以防范暴力破解。

    4. Audit Log 插件:

    审计日志插件:

    MySQL 8.0引入了审计日志插件,可以用于记录数据库服务器的活动,包括用户登录、权限变更、查询执行等,提高了对数据库安全性的监控和审计能力。

    5. 用户认证和权限管理的 SQL 接口改进:

    SET ROLE 语句:

    引入了 SET ROLE 语句,用于在会话中设置用户的角色,使得在会话中更灵活地管理用户的权限。

    ALTER USER 语句的增强:

    ALTER USER 语句进行了增强,支持修改密码、设置密码过期策略、设置默认角色等操作。

  • 相关阅读:
    【Linux学习笔记】 - 常用指令学习及其验证(下)
    互联网公司面试必问的Redis题目
    MySQL 教程 2.4
    HELP.md
    rk平台android12系统设置里面互联网选项中的以太网选项点击不了问题
    java-php-python-ssm学校图书馆管理系统计算机毕业设计
    论文阅读《Direct Sparse Visual-Inertial Odometry Using Dynamic Marginalization》
    5.玩明白wait-notify-notifyAll方法
    数字人直播系统开发哪家好?
    Java:实现动态数组类算法(附完整源码)
  • 原文地址:https://blog.csdn.net/weixin_41860630/article/details/134496132