【面试】MySQL面试之服务器配置类问题

MySQL面试之服务器配置类问题

整理了一下面试中对于 MySQL 部分,面试官会涉及的一些服务器配置类问题

1. 常见问题归纳

  • 请分析一个 Group by 语句的异常原因
  • 如何比较系统运行配置和配置文件中的配置是否一致
  • 举几个 MySQL中的关键性能参数

2. 分析一个Group by语句的异常原因

现有一张 product 产品表,表中内容如下
【面试】MySQL面试之服务器配置类问题_第1张图片
执行如下 SQL 语句,分析结果的异常

SELECT warehouse_id,SUM(COUNT) AS cnt 
FROM product
GROUP BY product_id;

得到结果如下:
在这里插入图片描述
异常结果原因:违背了 ONLY_FULL_GROUP_BY 的 SQL_Mode原则
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
所以对于设置了这个mode的数据库,在使用group by 的时候,就要用MAX(),SUM(),ANT_VALUE()这种聚合函数,才能完成GROUP BY 的聚合操作。
需改写 SQL 语句为

SELECT product_id,warehouse_id,SUM(COUNT) AS cnt 
FROM product
GROUP BY product_id;

得到正确结果
在这里插入图片描述

SQL_Mode

  • 配置 MySQL 处理 SQL 的方式
  • set [session/global/persist] sql_mode = ‘xxxxx’
  • [mysqld] sql_mode = xxxx

【面试】MySQL面试之服务器配置类问题_第2张图片
【面试】MySQL面试之服务器配置类问题_第3张图片

常用的SQL_Mode

SQL_Mode 说明
ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果出现在SELECT中的列、HAVING或者GROUP BY子句的非聚合列,没有在GROUP BY 中 出现,那么这个SQL语法检查报错
ANSI_QUOTEST 禁止用双引号来引用字符串
REAL_AS_FLOAT Real 作为 Float 的同义词
PIPES_AS_CONCAT || 视为字符串的连接操作符而非 或 运算符
STRICT_TRANS_TABLES/STRICT_ALL_TABLES 在事务储存引擎/所有储存引擎上启用严格模式出现,那么这个 SQL 语法检查报错
ERROR_FOR_DIVISION_BY_ZERO 不允许 0 作为除数
NO_AUTO_CREATE_USER 在用户不存在时不允许使用 GRANT 语句自动建立用户
NO_ZERO_IN_DATE/NO_ZERO_DATE 日期数据内/日期数据不能含有 0
NO_ENGINE_SUBSTITUTION 当指定的储存引擎不可用时报错

3. 比较系统运行配置和配置文件中的配置

  • 使用 set 命令配置动态参数
  • 使用 pt-config-diff 工具比较配置文件

使用 set 命令配置动态参数

  • set [session | @@session.] system_var_name = expr
  • set [global | @@global .] system_var_name = expr
  • set [persist| @@persist.] system_var_name = expr

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

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

【面试】MySQL面试之服务器配置类问题_第4张图片

4. mysql关键性能参数

1、服务器配置参数

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

2、储存引擎参数

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

时间: 2019.6.28 21:05

你可能感兴趣的:(数据库)