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