mysql服务器选项与变量

mysql服务器选项与变量

服务器选项options

https://dev.mysql.com/doc/refman/5.7/en/server-option-variable-reference.html

https://mariadb.com/kb/en/full-list-of-mariadb-options-system-and-status-variables/

mysql和mariadb官方手册,每个变量或服务器选项会列出默认值,取值范围、生效范围、是否可以动态修改;

**生效范围:**全局有效,或本会话有效

**修改时:**支持运行时修改,或修改后必须重启后生效

mysqd选项

查看mysqld支持的选项

[root@host2 ~]# mysqld --verbose --help

查看运行时mysql的变量


[root@host2 ~]# mysqladmin -uroot -pyes variables

查看mysqld启动时将要用到的选项

[root@host2 ~]# mysqld --print-defaults
mysqld would have been started with the following arguments:
--port=3306 --socket=/tmp/mysql.sock --skip-external-locking --key_buffer_size=16M --max_allowed_packet=1M --table_open_cache=64 --sort_buffer_size=512K --net_buffer_length=8K --read_buffer_size=256K --read_rnd_buffer_size=512K --myisam_sort_buffer_size=8M --datadir=/data/mysql --innodb_file_per_table=on --skip_name_resolve=on --log-bin=mysql-bin --binlog_format=mixed --server-id=1 
# 是通过读取配置文件获得的

系统变量variable

the scope of the variable (Var Scope) is Global, Session, or both.

服务器的系统变量,分为全局和会话2种级别;

全局

查看全局变量

MariaDB [information_schema]> show global variables\G;
# 查看所有的全局变量


MariaDB [information_schema]> select @@wsrep_sst_method;
+--------------------+
| @@wsrep_sst_method |
+--------------------+
| rsync              |
+--------------------+
1 row in set (0.00 sec)
# 查看某变量的值

修改全局变量

set global var_name=value;
set @@global.var_name=value;

会话

查看会话变量

MariaDB [information_schema]> show session variables\G;
# 查看所有系统变量

MariaDB [information_schema]> select @@wsrep_sst_method;
+--------------------+
| @@wsrep_sst_method |
+--------------------+
| rsync              |
+--------------------+
1 row in set (0.00 sec)
# 查看某变量值

修改会话变量

set session var_name=value;
set @@session.var_name=value;

状态变量status

状态变量为只读;不像系统变量可以修改(运行时或必须重启);也分为全局和会话2个级别

全局

MariaDB [information_schema]> show global status\G;

会话

MariaDB [information_schema]> show session status\G;

sql_mode

详见:https://mariadb.com/kb/en/sql-mode/

sql_mode可以对执行的sql语句做一些约束限制;

  • no_auto_create_user:禁止grant创建密码为空的用户
  • no_zero_date 不允许使用0000-00-00的时间
  • ...

默认的sql mode

MariaDB [information_schema]> select @@sql_mode;
+-------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查询优化

sql执行过程

  1. 通过mysql协议连接到mysql服务器端软件;
  2. 通过网络发送sql语句;
  3. 根据sql的hash值对比缓存,若有hash值相同的语句说明相同的sql之前执行过,可以直接返回缓存中结果;
  4. 如果没有命中缓存,则经由语法解析、预处理、等步骤
  5. 再经由查询优化器,对sql做性能上的优化处理
  6. 然后生成执行计划;
  7. 由执行引擎执行生成的执行计划;
  8. 通过存储引擎提供的接口执行执行计划;
  9. 将查询后的结果缓存一份,并返回客户端;

image-20200922162541949

查询缓存

不会被缓存的sql

  • 加了sql_no_cache参数
  • 查询sql中有自定义函数now(),curdate()等
  • 对临时表的查询操作
  • ...

查询缓存相关变量

query_cache_min_res_unit
查询缓存内存块的分配单位,默认4k

query_cache_limit
单个缓存能缓存的最大值,默认1m,即单个语句查询结果大于1m的不能缓存

query_cache_size
查询缓存的总大小

query_cache_type
是否开启缓存,取值为on,off,demand

sql_cache
sql_no_cache
查询语句中,明确指定


查询缓存相关状态变量

MariaDB [(none)]> show global status like 'Qcache%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 1       |
| Qcache_free_memory      | 1031336 |
| Qcache_hits             | 0       |
| Qcache_inserts          | 0       |
| Qcache_lowmem_prunes    | 0       |
| Qcache_not_cached       | 0       |
| Qcache_queries_in_cache | 0       |
| Qcache_total_blocks     | 1       |
+-------------------------+---------+

空闲状态的块
空闲状态的内存总量
查询缓存命中次数
向缓存中插入新的缓存次数,即未命中次数
因内存空间不足,比移除的缓存数
没有被cache的sql数
在缓存中sql数
内存中总共块数量

缓存命中率:
qcache_hits/(qcache_hits + qcache_insert)
缓存内存使用率:
(query_cache_size-qcache_free_memory)/query_cache_size
updatedupdated2021-03-092021-03-09
加载评论