1、请分析一个 group by 语句异常的原因?
pro_id | caet_id | ware_id | count |
---|---|---|---|
2030 | 9 | 1 | 10 |
2030 | 9 | 2 | 15 |
2030 | 9 | 3 | 20 |
2040 | 8 | 1 | 30 |
2040 | 8 | 2 | 20 |
执行下面的 sql 语句:
SELECT pro_id,ware_id,SUM(count) as cnt FROM product GROUP BY pro_id;
复制
执行 sql 后的结果:
pro_id | ware_id | cnt |
---|---|---|
2030 | 1 | 45 |
2040 | 1 | 50 |
结果集中只有 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_float | Real 做为 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_commit | 1、每秒进行一次重做日志的磁盘刷新操作。2、每次事务提交都会刷新事务日志到磁盘中。3、每次事务提交写入系统缓存每秒向磁盘刷新一次。 |
innodb_buffer_pool_size | 设置 innoDB 缓冲池的大小,应为系统可用内存的 75%。 |
innodb_buffer_pool_instances | InnoDB 缓冲池的实例大小,每个实例的大小为总缓冲池大小/实例个数 |
innodb_file_per_table | 设置每个表独立使用一个表空间文件 |
文章转载自零点小思随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1408次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
534次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
488次阅读
2025-03-13 14:38:19
SQL优化 - explain查看SQL执行计划(一)
金同学
419次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
412次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
361次阅读
2025-03-17 10:36:40
MySQL数据库当前和历史事务分析
听见风的声音
337次阅读
2025-04-01 08:47:17
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
298次阅读
2025-03-28 16:28:31
墨天轮个人数说知识点合集
JiekeXu
290次阅读
2025-04-01 15:56:03
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
281次阅读
2025-03-10 07:58:44