一直在做web端网络开发,也是在理解静态网页、动态网页后,就一直和Mysql数据库打交道。
刚开始做的小项目,除了Mysql基本增删改查以外,最多就用用连表查询,因为没有需求,所以自己也没有下功夫深入理解数据库。随着工作深入和项目业务量的增加,越来越感受到自己对于数据库运用的粗浅,每次遇到项目运行效率和并发的问题,都在一次次对自己进行灵魂拷问,数据库这部分,你是不是糊弄过去了?
再也不能逃避,必须重新面对Mysql,重新理解这个工具,因此,从基础开始整理,通过沉淀文档来巩固Mysql的知识体系,对这部分知识内容进行回炉再造。
但是,也不可能像Mysql教程那样整理名词概念,所以如果是刚接触Mysql的朋友,不建议看我的这个专栏学习,可以先看看 菜鸟 这类专门的教程网站。
好了,废话不多说,开干!
一、连接Mysql
1. 连接mysql命令
命令: mysql -h 数据库地址ip或域名 -u 登录账户名 -p
eg: mysql -h 127.0.0.1 -u root -p // 直接回车键入密码
2. 选项说明
-h :指定数据库地址,不指定-h参数默认值为localhost;
-u :mysql数据库账户名;
-p :指定密码,如果密码为空,可以不用指定-p选项。
二、查看Mysql系统变量
1. 查看mysql系统变量命令格式
// 匹配查询多个变量 (常用)
SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern' | WHERE expr];
// 查询单个变量值
SELECT @@[GLOBAL | SESSION].variable;
eg:SELECT @@GLOBAL.sort_buffer_size; // 查询全局变量中执行排序使用的缓冲大小
2. 选项说明
1. [] 中内容是可选的,直接SHOW VARIABLES,可以查询出所有的系统变量;
2. [GLOBAL | SESSION]:指定查找范围,默认为SESSION。
(1)GLOBAL:指定查询范围是全局变量;
(2)SESSION:指定查询范围是会话变量。
3. [LIKE 'pattern' | WHERE expr]:指定查找条件,LIKE和WHERE的使用就和SQL查询数据表语句一样。
全局变量(GLOBAL)和会话变量(SESSION / LOCAL)概念:
1. 全局变量:全局变量在MYSQL启动的时候由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.ini这个文件来更改;
2. 会话变量:在每次建立一个新的连接的时候,由MYSQL来初始化,MYSQL会将当前所有全局变量的值复制一份作为会话变量。如果在建立会话(连接mysql)以后,没有手动更改过会话变量与全局变量的值,那所有全局变量和会话变量所有的值都是一样的;
3. 区别:对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。
3. 获取当前mysql端口号
SHOW VARIABLES LIKE 'port';
4. 查询当前mysql编码
SHOW VARIABLES LIKE 'character%';
查询结果说明:
character_set_client :客户端编码方式;
character_set_connection :建立连接使用的编码;
character_set_database :数据库的编码;
character_set_results :结果集的编码;
character_set_server :数据库服务器的编码。只要保证以上编码都为utf8,就不会出现数据库数据乱码问题。
5. 查询当前mysql允许最大连接数
SHOW VARIABLES LIKE '%max_connections%';
6. 查看数据库文件存放路径
SHOW VARIABLES LIKE '%datadir%';
7. 查看mysql超时(timeout)相关配置
SHOW GLOBAL VARIABLES LIKE "%timeout%";
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 120 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+-----------------------------+----------+
参数说明:
- connect_timeout:在获取链接时,等待握手的超时时间,只在登录时有效,登录成功这个参数就不管事了。主要是为了防止网络不佳时应用重连导致连接数涨太快,一般默认即可;
- delayed_insert_timeout::这是为MyISAM INSERT DELAY设计的超时参数,在INSERT DELAY中止前等待INSERT语句的时间;
- innodb_lock_wait_timeout:就是事务遇到锁等待时的Query超时时间。跟死锁不一样,InnoDB一旦检测到死锁立刻就会回滚代价小的那个事务,锁等待是没有死锁的情况下一个事务持有另一个事务需要的锁资源,被回滚的肯定是请求锁的那个Query;
- innodb_rollback_on_timeout:这个参数关闭或不存在的话遇到超时只回滚事务最后一个Query,打开的话事务遇到超时就回滚整个事务;
- interactive_timeout/wait_timeout:一个持续SLEEP状态的线程多久被关闭。线程每次被使用都会被唤醒为acrivity状态,执行完Query后成为interactive状态,重新开始计时。wait_timeout不同在于只作用于TCP/IP和Socket链接的线程,意义是一样的。一般设置是8小时,一般网站白天都有人访问,从夜里到早上一般都会超过8小时,所以再来访问就会这个问题;
- net_read_timeout / net_write_timeout:这个参数只对TCP/IP链接有效,分别是数据库等待接收客户端发送网络包和发送网络包给客户端的超时时间,这是在Activity状态下的线程才有效的参数;
- slave_net_timeout:这是Slave判断主机是否挂掉的超时设置,在设定时间内依然没有获取到Master的回应就人为Master挂掉了。
参考地址:https://www.jianshu.com/p/95f802399b6f
三、设置或修改Mysql系统变量
1. 设置系统全局(GLOBAL)变量,方法一(不推荐):修改mysql配置文件,重启mysql。
// 1. 打开mysql配置文件
vim /etc/my.cnf
// 2. 修改指定配置,以下修改wait_timeout作为示例
[mysqld]
wait_timeout=10
// 重启Mysql
service mysqld restart
2. 设置系统全局(GLOBAL)变量,方法二(推荐):在命令行里通过SET来设置,然后再修改mysql配置文件(my.cnf)中的参数,但不用重启mysql。
// 1. SET设置系统全局变量
方式1:SET GLOBAL wait_timeout=10;
方式2:SET @@GLOBAL.wait_time=10;
// 2. 查询设置是否生效(注意加GLOBAL,SHOW查询默认是SESSION变量)
SHOW GLOBAL VARIABLES LIKE 'wait_time';
// 3. 修改配置文件
vim /etc/my.cnf
补充说明:
mysql如果重启,会读取my.cnf的配置重新写入系统全局变量;
SET更改系统全局变量只能在此次mysql运行中有效;
如果mysql服务器因为其他原因重启后,SET设置的全局变量值就会失效。
3. 还原系统全局变量为mysql初始化的值
方式1:SET GLOBAL wait_time=DEFAULT;
方式2:SET @@GLOBAL.wait_timeout=DEFAULT;
4. 设置系统会话变量
// SET设置系统会话变量
方式1:SET wait_timeout=10;
方式2:SET SESSION wait_timeout=10;
方式3:SET LOCAL wait_timeout=10;
方式4:SET @@wait_timeout=10;
方式5:SET @@SESSION.wait_timeout=10;
方式6:SET @@LOCAL.wait_timeout=10;
// 查看配置是否生效
方式1:select @@wait_timeout;
方式2:select @@session.wait_timeout;
方式3:select @@local.wait_timeout;
方式4:show variables like 'wait_timeout';
方式5:show local variables like 'wait_timeout';
方式6:show session variables like 'wait_timeout';
5. 还原系统会话变量值为mysql初始化的值
方式1:SET wait_timeout=DEFAULT;
方式2:SET SESSION wait_timeout=DEFAULT;
方式3:SET LOCAL wait_timeout=DEFAULT;
方式4:SET @@wait_timeout=DEFAULT;
方式5:SET @@SESSION.wait_timeout=DEFAULT;
方式6:SET @@LOCAL.wait_timeout=DEFAULT;
6. 系统全局变量和系统会话变量值转换
SET @@SESSION.wait_timeout=@@GLOBAL.wait_timeout;
7. 注意:并不是所有的系统变量都能被设置为DEFAULT,如果设置这些变量为DEFAULT则会返回错误。
四、查看Mysql运行状态变量
1. 命令格式:
SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern'];
2. 选项说明:
1. [] 中内容是可选的,直接SHOW STATUS,可以查询出所有的系统状态变量;
2. [GLOBAL | SESSION]:指定查找范围,默认为SESSION。
(1)GLOBAL:指定查询范围是全局变量;
(2)SESSION:指定查询范围是会话变量。
3. [LIKE 'pattern']:指定查找条件,LIKE的使用就和SQL查询数据表语句一样。
3. 常用状态查询
--查看所有状态信息
SHOW STATUS;
--查看MySQL本次启动后的运行时间(单位:秒)
SHOW STATUS LIKE 'uptime';
--查看select语句的执行数
SHOW [GLOBAL] STATUS LIKE 'com_select';
--查看insert语句的执行数
SHOW [GLOBAL] STATUS LIKE 'com_insert';
--查看update语句的执行数
SHOW [GLOBAL] STATUS LIKE 'com_update';
--查看delete语句的执行数
SHOW [GLOBAL] STATUS LIKE 'com_delete';
--查看试图连接到MySQL(不管是否连接成功)的连接数
SHOW STATUS LIKE 'connections';
--查看线程缓存内的线程的数量
SHOW STATUS LIKE 'threads_cached';
--查看当前与mysql已经建立连接的数量,一个连接就需要一个线程,即被使用的线程数
SHOW STATUS LIKE 'threads_connected';
--查看当前打开的连接的数量
SHOW STATUS LIKE 'threads_connected';
--查看创建用来处理连接的线程数,如果Threads_created较大,可能需要增加thread_cache_size值
SHOW STATUS LIKE 'threads_created';
--查看激活的(非睡眠状态)线程数
SHOW STATUS LIKE 'threads_running';
--查看立即获得的表的锁的次数
SHOW STATUS LIKE 'table_locks_immediate';
--查看不能立即获得的表的锁的次数,如果该值较高,并且有性能问题,应首先优化查询,然后拆分表或使用复制
SHOW STATUS LIKE 'table_locks_waited';
--查看创建时间超过slow_launch_time秒的线程数
SHOW STATUS LIKE 'slow_launch_threads';
--查看查询时间超过long_query_time秒的查询的个数
SHOW STATUS LIKE 'slow_queries';
五、查看当前Mysql状态
1. 查询命令
STATUS
2. 查询结果说明
mysql Ver 14.14 Distrib 5.5.53, for Win32 (AMD64)
Connection id: 474
Current database: project // 当前use操作数据库
Current user: root@localhost // 当前登录账户
SSL: Not in use // ssl信息
Using delimiter: ; // 使用的分隔符为 ";"
Server version: 5.5.53-log MySQL Community Server (GPL) // mysql版本
Protocol version: 10 // 协议版本
Connection: localhost via TCP/IP // 连接方式
Server characterset: utf8 // 数据库服务器的编码
Db characterset: utf8 // 当前project数据库编码
Client characterset: utf8 // 客户端编码
Conn. characterset: utf8 // 数据库连接编码
TCP port: 3306 // TCP连接端口号
Uptime: 1 day 7 hours 31 min 56 sec // mysql自上次启动后的时间
Threads: 1 // mysql连接数
Questions: 5917 // 从上次mysql启动后已经发送给服务器的查询的个数
Slow queries: 0 // 超过long_query_time秒的查询数
Opens: 257 // 服务器已打开的表数量
Flush tables: 1 // 服务器已执行的flush- *,refresh和reload命令的数量
Open tables: 0 // 当前打开的表的数量
Queries per second avg: 0.052 // 从上次mysql启动运行开始计算,每秒钟平均查询次数