mariadb> SHOW GLOBAL VARIABLES; 全局变量影响服务器的全局操作
mariadb> SHOW [SESSION] VARIABLES; 客户端变量,只对当前会话生效
注意:其中有些参数支持运行时修改,会立即生效;有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效
有些参数作用域是全局的,且不可改变;有些可以为每个用户提供单独的设置
修改服务器变量的值
全局: mariadb> SET GLOBAL system_varname=value;
mariadb> SET @@global.system_varname=value;
会话: mariadb> SET [SESSION] system_varname=value;
例如: set global sql_mode=strict_trans_tables; 常用MODE:TRADITIONAL, STRICT_TRANS_TABLES
sql_mode默认为空,建议开发人员将这个值设为严格模式,这样有些问题可以在数据库的设计和开发阶段就能发现,而如果在生产环境下运行数据库后发现这类问题,那么修改的代价将变得十分巨大
状态变量:用于保存mariadb运行中的统计数据的变量
mariadb> SHOW GLOBAL STATUS;
mariadb> SHOW [SESSION] STATUS;
如何获取程序默认使用的配置:mysql --print-defaults(客户端) mysqld --print-defaults(服务端)
mariadb工作于单进程多线程模式,下面是一张mariadb架构图
mariadb查询执行路径
1:客户端发送一条查询给服务器
2:服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段
3:服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划
4:MariaDB根据优化器生成的执行计划,调用存储引擎的API来执行查询
5:将结果返回给客户端
上面这张图可以看到整个students表中,StuID字段有一个叫PRIMARY的索引
key: PRIMARY 此次查询用到的索引 type: const 这个字段表示查询一行,在数据库中直接加载一行(rows: 1),这就是索引的效果,通过索引直接定位到了要加载的行
age字段中没有索引,type: ALL:进行了全表扫描,取了25行(rows: 25), 把所有行都取出来后使用where条件对每一行逐个过滤
(Extra: Using where)
如果表的数据大的话,第二种相对于第一种查询会很慢!!
查询缓存:
查询语句任何字符上的不同,都会导致缓存不能命中,缓存的数据都放在内存中
哪些查询可能不会被缓存:查询中包含UDF、存储函数、用户自定义变量、临时表、mysql库中系统表、或者包含列级权限的
表、有着不确定值的函数(Now())
查询缓存相关的服务器变量:query_cache_min_res_unit: 查询缓存中内存块的最小分配单位
较小值会减少浪费,但会导致更频繁的内存分配操作,较大值会带来浪费,导致碎片过多
query_cache_limit:能够缓存的最大查询结果
query_cache_size:查询缓存总共可用的内存空间;单位是字节,必须是1024的整数倍,默认为0表示不开启
query_cache_wlock_invalidate:如果某表被其它的连接锁定,是否仍然可以从查询缓存中返回结果;默认值为OFF,表示可以在表
被其它连接的场景中继续从缓存返回数据;ON则表示不允许
以上变量可以通过show global variables like '%query%';命令获取
查看缓存命中次数:show global status like 'Qcache%';
查看查询次数show global status like 'com_select';
缓存命中率的评估:Qcache_hits/(Qcache_hits+Com_select)
CentOS系统使用yum安装MariaDB数据库
Ubuntu 上如何将 MySQL 5.5 数据库迁移到 MariaDB 10