MySQL 8.0默认的身份认证插件从mysql_native_password变更为caching_sha2_password。许多旧的客户端或驱动程序不支持新的认证方式,从而导致连接失败。

解决方案是修改用户的认证插件或升级客户端。可以登录MySQL服务器,执行以下命令来修改特定用户的认证方式:
ALTER USER ‘your_username’@’host’ IDENTIFIED WITH mysql_native_password BY ‘your_password’;
FLUSH PRIVILEGES;
也可以在MySQL的配置文件my.cnf(或my.ini)中,在[mysqld]部分添加以下配置,将默认认证插件改回旧版本:
default_authentication_plugin=mysql_native_password
修改配置后,需要重启MySQL服务使其生效。对于新创建的用户,也需要指定使用兼容的认证插件。
窗口函数执行效率低下
MySQL 8.0开始支持窗口函数,如ROW_NUMBER, RANK等,这极大地简化了复杂查询的编写。在不恰当的索引或大数据集下,窗口函数的性能可能不尽如人意。
优化窗口函数查询的关键在于确保其OVER子句中的PARTITION BY和ORDER BY字段上有合适的索引。例如,对于查询:
SELECT id, name, department, salary,
ROW_NUMBER OVER (PARTITION BY department ORDER BY salary DESC) as rank
FROM employees;
一个在(department, salary)上的复合索引将显著提升查询性能。应尽量避免在窗口函数中对大量数据进行全表扫描,可以通过WHERE子句先过滤数据。
公用表表达式(CTE)的递归深度限制
公用表表达式(CTE),特别是递归CTE,是MySQL 8.0引入的强大功能。但递归CTE默认有最大递归深度的限制,由系统变量cte_max_recursion_depth控制,默认值为1000。当递归层次超过此限制时,查询会报错。
解决方法是在会话或全局级别调整此参数。例如,将会话内的递归深度限制提高到10000:
SET SESSION cte_max_recursion_depth = 10000;
或者,在配置文件中永久修改:
[mysqld]
cte_max_recursion_depth = 10000
更重要的是,在编写递归CTE时,必须确保有明确的终止条件,并且逻辑正确,以防止无限递归消耗资源。
字符集与排序规则冲突
MySQL 8.0对字符集和排序规则的支持更为严格,默认的字符集是utf8mb4,默认的排序规则是utf8mb4_0900_ai_ci
。在不同数据库、表或列之间进行关联查询或比较时,如果字符集或排序规则不一致,可能会导致错误或性能问题。
检查相关对象的字符集设置:
SHOW CREATE DATABASE your_database;
SHOW CREATE TABLE your_table;
解决方案通常有两种。一是在创建数据库、表或列时,显式地指定统一的字符集和排序规则。二是在查询时,使用COLLATE子句进行强制转换,例如:
SELECT * FROM table1 t1
JOIN table2 t2 ON t1.name = t2.name COLLATE utf8mb4_0900_ai_ci;
建议在项目初期就规划并统一使用utf8mb4字符集及其合适的排序规则。
性能模式与系统资源监控
MySQL 8.0的性能模式(Performance Schema)默认是开启的,它提供了丰富的服务器运行时的性能数据。但对于一些资源受限的服务器,性能模式本身的数据收集可能会带来额外的开销。
如果确实需要关闭性能模式以节省资源,可以在配置文件中设置:
[mysqld]
performance_schema = OFF
更推荐的做法是精细地配置性能模式,只启用需要的监控项。例如,可以只监控特定的等待事件或阶段事件:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'wait/io/file/%';
通过查询performance_schema中的表,如events_statements_summary_by_digest,可以快速定位高开销的SQL语句,这是性能调优的利器。
组复制与高可用配置难点
MySQL 8.0的InnoDB集群通常基于MySQL Group Replication(组复制)实现高可用。在配置过程中,常见的疑难问题包括网络防火墙导致节点无法通信、服务器UUID冲突、以及参数配置不当等。
一个基础的组复制配置检查清单如下:
- 网络连通性:确保所有组成员之间的端口(默认33061)是开放的。
- 服务器UUID:确保每台服务器的
server_uuid是唯一的。 - 二进制日志:必须开启
log_bin和log_slave_updates。 - 事务存储引擎:表必须使用InnoDB存储引擎。
- 参数配置:正确设置
transaction_write_set_extraction,group_replication_group_name等。
启动组复制的典型命令序列如下,务必在主节点引导集群:
在第一个节点上执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
在其他节点上执行
START GROUP_REPLICATION;
配置成功后,可以通过SELECT * FROM performance_schema.replication_group_members;查看组成员状态。
内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。
本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/134558.html