暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 服务器配置类问题

零点小思随笔 2021-05-07
263

1、请分析一个 group by 语句异常的原因?

pro_idcaet_idware_idcount
20309110
20309215
20309320
20408130
20408220

执行下面的 sql 语句:

SELECT pro_id,ware_id,SUM(count) as cnt FROM product GROUP BY pro_id;

复制

执行 sql 后的结果:

pro_idware_idcnt
2030145
2040150

结果集中只有 pro_id 分组,而忽略了 ware_id 分组。这应该是 SQL 语法错误,可为什么没有报错,而是输出错误结果呢?这就涉及到 SQL MODE。

SQL MODE 的作用:

  • 配置 MySQL 处理 SQL 的方式
  • set [session/global/persist] sql_mode = 'xxxxxx'
    • set session:只对当前线程起作用
    • set global:全局起作用
    • st persist:类似于 set global,会对全局的变量值进行修改,不同的是修改 global 在实例重启后,变量值就会恢复成配置文件中的所配置的值,set global 命令修改的值就会丢失;而 st persist 会对动态修改的变量进行持久化保存。
  • [mysqld] sql_mode = xxxxxx

常用的 SQL MODE :

sql_mode说明
only_full_group_by对于 Group By 聚合操作,如果出现在 select 中的列、having 或者 order by 字句的非聚合列,没有在 Group By 中出现,那么这个 SQL 语法检查错误。
ansi_quotes禁止用双引号来引用字符串
real_as_floatReal 做为 float 同义词
pipes_as_concat将”双竖线“视为字符串的连接操作符而非 或 运算符
strict_trans_tables/strict_all_tables在事务存储引擎/所有存储引擎上启用严格模式
error_for_division_by_zero不允许 0 作为除数
no_auto_create_user在用户不存在时不允许 grant 语句自动建立用户
no_zero_in_date/no_zero_date日期数据内/日期数据不能含 0
no_engine_substitution当指定的存储引擎不可用时报错
# 查看实例的 SQL MODE 设置
mysql> show variables like 'sql_mode';

+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                 |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

复制

设置 SQL MODE

mysql> set session sql_mode='ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION';
mysql> show variables like 'sql_mode';
+---------------+-------------------------------------------+
| Variable_name | Value                                     |
+---------------+-------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------+
1 row in set (0.00 sec)

复制

修改上面的 sql 语句:

mysql> SELECT pro_id,ware_id,SUM(count) as cnt FROM product GROUP BY pro_id,ware_id;
+--------+---------+------+
| pro_id | ware_id | cnt  |
+--------+---------+------+
|   2030 |       1 |   10 |
|   2030 |       2 |   15 |
|   2030 |       3 |   25 |
|   2040 |       1 |   30 |
|   2040 |       3 |   20 |
+--------+---------+------+
5 rows in set (0.00 sec)

复制

2、 如何比较系统运行配置和配置文件中的配置参数是否一致?

2.1、 使用 set 命令配置动态参数

  • set[session|@@session].system_var_name = expr
  • set[global|@@global].system_var_name = expr
  • set[persist|@@persist].system_var_name = expr 示例:
mysql> set global wait_timeout=300;
mysql> show variables like 'max_connection';
mysql> show variables like 'max_connect%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 100   |
| max_connections    | 151   |
+--------------------+-------+
2 rows in set (0.00 sec)
mysql> set persist max_connections=1000;
mysql> show variables like 'max_connect%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 100   |
| max_connections    | 1000  |
+--------------------+-------+
2 rows in set (0.01 sec)

复制

2.2 、使用 pt-config-diff 工具比较配置文件

  • pt-config-diff u=root,p=,h=localhost /etc/my.cnf

3、 举几个 MySQL 中关键性能参数

3.1、服务器配置参数

参数说明
max_connections设置允许 MySQL 访问的最大连接数
interactive_timeout设置交互连接的 timeout 时间
wait_timeout设置非交互连接的 timeout 时间
max_allowed_packet控制 MySQL 可以接收的数据包的大小
sync_binlog表示每写多少次缓冲会向磁盘同步一次 binlog
sort_buffer_size设置每个会话使用的排序缓存区的大小
job_buffer_size设置每个会话使用的连接缓冲的大小
read_buffer_size指定了当对一个 myisam 进行表扫描时所分配的读缓存池的大小
read_rnd_buffer_size设置控制索引缓冲区的大小
binlog_cache_size设置每个会话用于缓存未提交的事务缓存大小

3.2、存储引擎参数

参数说明
innodb_flush_log_at_trx_commit1、每秒进行一次重做日志的磁盘刷新操作。2、每次事务提交都会刷新事务日志到磁盘中。3、每次事务提交写入系统缓存每秒向磁盘刷新一次。
innodb_buffer_pool_size设置 innoDB 缓冲池的大小,应为系统可用内存的 75%。
innodb_buffer_pool_instancesInnoDB 缓冲池的实例大小,每个实例的大小为总缓冲池大小/实例个数
innodb_file_per_table设置每个表独立使用一个表空间文件


文章转载自零点小思随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论