初学mysql的时候,一直觉得其系统环境变量很多,很神秘。一句show variables;就能查询到200多个环境变量,要是能把每个变量的意思都搞明白,岂不是就能窥探到mysql的衣角。
Mysql的变量分为三种:系统静态变量、系统动态变量和系统状态变量,在这里介绍了一下系统静态变量和状态变量,记录如下:
变量名称 | 解释说明 | 默认值 |
auto_increment_increment | 控制列的值的增量值 | 1 |
auto_increment_offset | 控制列的值的偏移量 | 1 |
Back_log | 监听队列的最大值 | 50 |
Basedir | Mysql的安装位置 |
|
Bdb_cache_size | 为BDB表缓存索引和行分配的缓冲区的大小 |
|
Binlog_cache_size | 同时开启事物和二进制日志,每个客户端日志的缓存大小 |
|
Bulk_insert_buffer_size | 非空表插数据(INSERT…SELECT|LOAD DATA INFILE),树状缓存 | 8M |
Character_set_client | 客户端语句的字符集 |
|
Character_set_connection | 用于没有字符集导入符的文字和数字----字符串转换 |
|
Character_set_database | 默认数据库使用的字符集 |
|
Character_set_results | 向客户端返回结果的字符集 |
|
Character_set_server | 服务器的默认字符集 |
|
Character_set_system | 服务器用来保存识别符的字符集,此值一定是utf8 | Utf8 |
Character_sets_dir | 字符集安装目录 |
|
Completion_type | 如果该值为0(默认),COMMIT和ROLLBACK不受影响 | 0 |
Concurrent_insert | 默认为ON,允许没有空数据块的前提下,insert和select并行,0为关闭 |
|
Connect_timeout | Mysqld服务器用bad handshake响应前等待连接包的秒数 | 10 |
Datadir | 数据保存目录 |
|
Default_week_format | WEEK()函数使用的默认值 |
|
div_precision_increment | 除法运算结果小数保留位数,默认为4,最大30 | 4 |
Expire_logs_days | 二进制日志删除的时间,如果开启会自动删除二进制日志 | 0 |
Flush |
| ON |
Group_concat_max_len | GROUP_CONCAT()函数结果的最大长度 |
|
Have_compress | 如果不支持,不能使用COMPRESS()和UNCOMPRESS()函数 |
|
Have_query_cache | 是否支持查询缓存 | YES |
Innodb_buffer_pool_size | Innodb缓冲池的大小,一般可以设置为内存的一半 |
|
innodb_flush_log_at_trx_commit | 是直接写磁盘,还是写系统缓存 |
|
Key_buffer_size | 索引的缓存区,多线程共享,最大为4G,并且受到操作系统对每个进程使用RAM的限制,最好是设置为内存的25% |
|
Local_infile | 是否支持LOAD DATA INFILE |
|
Log | 是否启用常规查询日志 | OFF |
Log_bin | 是否启用二进制日志 |
|
Log_error | 错误日志的位置 |
|
Log_slow_queries | 是否记录慢查询 |
|
Log_warnings | 是否产生其他警告信息 |
|
Long_query_time | 慢查询的时间标准 |
|
Max_binlog_cache_size | 多语句事务需要更大的内存 |
|
Max_binlog_size | 二进制日志文件的大小限制 | 1G |
Max_connections | 允许的并行客户端连接数目。 |
|
Max_error_count | 保存由show errors和show warnings显示的相关信息的条数 |
|
Max_user_connecttions | 账户允许的最大同时连接数,0表示没有限制 |
|
Pid_file | 进程ID文件的路径名 |
|
Port | 服务器监听端口 |
|
Query_cache_size | 为查询缓存分配的内存大小 |
|
Query_cache_type | OFF不缓存查询,这样不会取消query_cache_size的空间开销。应该将其置为0 | On |
Socket | 客户端链接的套接字文件(unix) |
|
Sort_buffer_size | 每个排序线程分配的缓冲区大小,可以加快order by和group by |
|
Tmpdir | 保存临时文件和临时表的目录 |
|
Version | 服务器版本号 |
|
上面只是一部分,还有很多没有记录,这是系统的环境设定的静态变量,那我们如果想查看mysql运行以来的状态,就可以用show status;
参数 | 说明 |
基本情况 |
|
Connections | 连接服务器(不管是否成功)的次数 |
Uptime | 服务器工作时间 |
Max_used_connections | 同时使用的最大连接数量 |
Open_tables | 当前打开的表的数量。 |
Opened_tables | 已经打开的表的数量。调优静态变量表缓存数table_cache:如果open_tables接近table_cache,并且opened_tables不断增长,就需要增加table_cache的值。 table_cache是所有线程打开的表的数目(一个表使用2个文件描述符),表数量多,就要大一些。增大该值可以增加mysqld需要的文件描述符的数量。根据数据库系统中表数量来决定该值,如2048。 |
线程使用情况 |
|
Threads_cached | 线程缓存内的线程数 |
Threads_connected | 当前打开的线程数 |
Threads_created | 创建过的线程数。调优静态变量线程缓存数thread_cache:如果该值增加很快,当前thread_cache_size的值可能太小。缓存访问率是Threads_created/Connections。 服务器应缓存多少线程以便重新使用。当客户端断开连接时,如果线程少于thread_cache_size,则客户端的线程被放入缓存,一般配置8。 |
Threads_running | 运行(非睡眠)状态的线程数 |
查询缓存 |
|
Qcache_free_blocks | 缓存中相邻内存块的个数。数目大说明可能有碎片。调优方法:FLUSH QUERY CACHE;会对缓存中的碎片进行整理,从而得到一个空闲块,如果flush运行的时间很长,说明缓存太大了,可以适当调小静态变量query_cache_size的值。 |
Qcache_free_memory | 缓存中剩余的内存。调优静态参数query_cache_size:如果剩余内存不足,可以增加该值,如设置query_cache_size=64M |
Qcache_hits | 查询缓存命中次数,该值越大越好 |
Qcache_inserts | 插入查询缓存的次数。缓存命中率 = 1 – Qcache_hits/ Qcache_inserts。80%以上的查询缓存命中率就算合格。 |
Qcache_lowmem_prunes | 查询缓存过低的次数。缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的free_blocks 和 free_memory 可以告诉您属于哪种情况)。 |
Qcache_not_cached | 不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句。 |
Qcache_queries_in_cache | 当前缓存的查询(和响应)的数量。 |
Qcache_total_blocks | 缓存中块的数量。 |
SQL执行频率 |
|
Com_select | 执行select操作次数 |
Com_insert | 执行insert操作次数 |
Com_update | 执行update操作次数 |
Com_delete | 执行delete操作次数 |
Com_commit | 事务执行commit操作次数 |
Comm_rollback | 事务执行rollback操作次数。如果回滚频繁,就说明程序存在某些问题。 |
Slow_queries | 慢查询的次数。调优SQL性能:如果该值增加很快,需要分析慢查询日志,针对查询SQL优化。 |
Innodb_rows_read | 执行select返回的行数。以下几个InnoDB的。 |
Innodb_rows_inserted | 执行insert操作的行数。通过这几个参数,可以知道数据库是查询为主还是插入为主。 |
Innodb_rows_updated | 执行update操作的行数 |
Innodb_rows_deleted | 执行delete操作的行数 |
Sort_merge_passes | 排序算法已经执行的合并的数量。调优静态变量sort_buffer_size:如果该值很大,说明排序缓冲区太小,如设置sort_buffer_size = 5M 当 MySQL 必须要进行排序时,就会在从磁盘上读取数据时分配一个排序缓冲区来存放这些数据行。如果要排序的数据太大,那么数据就必须保存到磁盘上的临时文件中,并再次进行排序。 |
索引使用情况 |
|
Handler_read_first | 使用全索引扫描的次数。如SELECT col1 FROM foo,假定col1有索引 |
Handler_read_key | 使用索引次数,该值越高越好。 |
Handler_read_next | 按照键顺序读下一行的请求数。使用索引描述时,从数据文件取数据的次数 |
Handler_read_prev | 使用索引描述时,按索引倒序从数据文件取数据的次数。一般是order by/desc查询 |
Handler_read_rnd | 查询直接操作数据文件的次数,有可能未使用索引 |
Handler_read_rnd_next | 在数据文件中读下一行的请求数。若该值非常大,说明使用了大量的表扫描,索引使用率不高或没有使用索引。Handler_read_rnd_next/Com_select是表扫描比率,如果该值超过 4000,就应该调优静态参数read_buffer_size。如read_buffer_size=1M,若超过8M,那么就要优化SQL了。 |
锁使用情况 |
|
Innodb_row_lock_current_waits | 当前等待行锁的行数 |
Innodb_row_lock_time | 行锁定用的总时间(ms) |
Innodb_row_lock_time_avg | 行锁定的平均时间(ms)。该值大,说明锁冲突大 |
Innodb_row_lock_time_max | 行锁定的最长时间(ms) |
Innodb_row_lock_waits | 行锁定必须等待的时间(ms)。该值大,说明锁冲突大 |
这也只是一部分,看完mysql的静态变量和状态变量,对与mysql的优化就应该有一定的认识了,准备有时间的时候测试一下。