mysql高级积累


# 查询整个数据库增删改查的次数,不加global是显示当前连接的次数,加是全局的数据
show GLOBAL STATUS LIKE 'Com_______';

#查询innodb引擎的增删改查的次数
show STATUS LIKE 'innodb_rows_%';

#查询所有连接当前主机MySQL服务的客户端信息,可以捕获到慢查询的SQL语句
show PROCESSLIST;

--  查询结果解析:
-- id:表示执行顺序,越大越优先
-- select_type: 查询的类型,一般有简单查询、子查询、关联查询等类型。 
-- type: 访问类型,const:表示通过索引一次就找到了。一般是用于主键或者唯一索引的查询,只返回一条记录。 ref:非唯一性索引, range:检索给定范围的行,走的索引。index:遍历索引树,也就是查询的内容都是索引。all:全表扫描
-- possible_keys : 可能用到的索引
-- key: 实际用到的索引
-- key_len: 索引的长度
-- rows:扫描的行数,也就是在执行查询时,实际扫描的行数,可作为查询效率的参考值,扫描的行数越少,效率越高
-- extra: useing index : 表示用了索引。using index condition:s使用了索引,但是回表查询了。
EXPLAIN SELECT * FROM test1 WHERE c1 =4;


#查询是否开启profile,是一种sql分析工具
SELECT @@profiling;

# 查询执行的SQL语句的耗时
show PROFILES;

#查询某个SQL语句具体的执行时间
show PROFILE FOR QUERY 10;

#trace 分析MySQL优化器的优化情况。
 

#索引优化:

-- or 条件如果任意一个条件没有通过索引查询,则整个语句的索引将会失效。
-- like 如果%加在了前面,索引就会失效,可以通过select 索引列优化,索引就会使用。
-- in 可以索引,not in 不走索引
-- 每创建一个索引,数据库就会给该索引维护一个数据结构表,当查询时,如果走索引,只会选择其中一个索引进行使用。并且,查询时,如果选择的这个索引中没有需要查询的列,则会回表查询(尽管该列也是一个索引,但不在该索引的叶子节点中)
 

#mysql 的内存缓存。可以帮助我们针对一些不经常更新的数据,增加查询效率。缓存会在服务重启后清空
-- 可以通过配置文件,将MySQL的查询缓存打开,查询的SQL会将结果缓存在内存中,下一次查询时,直接从缓存中获取,当数据被修改时,缓存失效。
-- SQL_CACHE  SQL_NO_CACHE  可以指定SQL的查询结果是否需要进行缓存: SELECT SQL_NO_CACHE * from test1; 
-- 可以通过配置文件,系统参数,修改缓存的内存大小,缓存开启的类型。
-- SQL语句不一致,无法命中缓存;使用不确定的函数时,比如now();当数据表发生更新时,缓存会失效被删除

#MySQL的内存优化,可以通过优化每个连接占用的内存、MySQL服务占用的内存等方面进行优化。根据不同的搜索引擎,来设置不同的参数。
#MySQL的并发参数调整,来增加MySQL的并发访问量。
-- 可以通过 show VARIABLES like '参数名'  来查询对应参数的当前值
-- MAX_CONNECTIONS 最大连接数,可以通过增加改值,增加并发访问,取决于服务器的配置。默认是151
-- back_log: 积压请求栈的大小,当MySQL达到了最大连接数后,其余的链接会被存放在栈中,增加该值,可增加队列中等待的连接数,栈慢后,会直接报错
-- INNODB_lock_wait_timeout 行锁的超时时间,默认是50ms

 

 

#MySQL的锁机制


--  对于myisam引擎来说,是表锁:读锁会阻塞写,不会阻塞读,写锁读写都会堵塞。

-- INNODB的引擎来说,是行锁:读不会加锁,写会对写的这一行加锁。测试时,可以通过关闭MySQL的自动提交 set autocommit=0;手动commit观察行锁对数据库读写的影响。
-- INNODB什么时候会变成表锁呢?:where中的查询条件如果没有走索引,或者索引失效。此时的操作,就是一个锁表的操作。innodb的行锁是通过给索引项加锁实现的,这就意味着只有通过索引条件检索数据时,innodb才使用行锁,否则使用表锁。
-- **** UPDATE test1 SET c2=2 WHERE c4 = 'c';  如果此时,c4不是索引,或者c4导致了索引失效,那次是的update操作,会将整个表加锁。
-- 间隙锁:对于键值在条件范围内但并不存在的记录,叫做间隙。例如查询id <10 ,如果当前表中只有1-6,则7-9就是间隙。加锁时,也会对这个间隙进行加锁。
-- 例如: update test1 set name='test' where id < 4; 当在执行该条语句的时候,还未提交时,执行 insert 插入一条满足where条件,但是不存在的数据时,会阻塞,因为该数据虽然不存在,但是已经被加锁了。

 

#MySQL日志:


#①错误日志查看:可以通过以下指令查询错误日志的存放路径:
show VARIA BLES LIKE 'log_error%';

#②二进制日志,默认是没有开启的,需要在MySQL的配置文件中开启:

log_bin=mysqlbin  mysqlbin就是生成的二进制文件名前缀

binlog_format=STATEMENT   #statement的意思是记录的都是SQL语句,除了select的语句外都会记录在二进制文件中。这是主从复制的主要原理、ROW记录的所有行的数据变更(例如执行一个全表更新,statement记录的就是一个update语句,而row则会记录更新每一行数据的update语句,如果有100条数据,就会记录1000个update语句)、

默认二进制的日志文件是存在放mysql的数据目录下,/var/lib/mysql中,由于记录的是二进制的文件类型,所以查看时,需要使用mysqlbinlog命令查看二进制文件。

可以通过不同的方式,对二进制日志文件进行删除。

查询日志,会记录mysql所有的操作日志,包括查询的日志,默认是不开启的。需要在配置文件中开启

general_log=1  1表示开启,0表示关闭

general_log_file=file_name.log  指定日志的文件名

开启后,所有指定的mysql语句都会在该文件中显示。包括用mybatis指定的SQL均会显示。是一个排错利器

慢查询日志,记录查询效率比较低的SQL语句

可以通过控制两个参数,来决定什么样的查询被mysql认定为慢查询:mysql配置文件中:

slow_query_log=1  手动开启慢查询日志

slow_query_log_file=file_name.log  慢查询日志的文件名

long_query_time=10  超过查询时间的超时时间,默认是10秒。执行时间超过10秒,就会被日志文件记录。

 

#搭建主从复制mysql

搭建时,需要将mysql的master节点配置文件设置成开启二进制文件,然后为从节点设置账号,

然后在从节点中配置文件配置二进制文件,并通过指令连接到master节点,将本mysql设置为slave节点,即可完成主从复制的搭建,详细搭建过程可参考教程:

https://www.bilibili.com/video/BV1UQ4y1P7Xr?p=103

①在master服务器上修改mysql的配置文件:

server-id=1  #设置服务ID,保证唯一

log-bin=/var/lib/mysql/mysqlbin  #开启二进制日志,并保存在该路径下

read-only=0   #设置读写模式,1是制度,0是读写

binlog-ignore-db=mysql       #表示二进制同步时,忽略的数据库

保存后重启mysql

②创建slave数据库的账号

在master数据库中执行SQL:

grant replication slave on *.* to 'slave1'@'124.234.15.224' identified by 'slave1';    #表示创建一个slave1的账号,并制定IP连接,指定密码

flush privileges    #刷新权限

③查看master的状态:

show master status;

该命令会查询出master节点的状态信息,file记录的是同步读取的二进制文件、position记录的是二进制文件从第几行读取,这些信息在slave节点连接master节点时,会需要

④配置slave节点配置文件

server-id=2 

log-bin=/var/lib/mysql/mysqlbin

重启mysql

⑤连接master节点

在slave节点执行SQL:

#该命令的意思是:连接那个master节点的IP,以及使用哪个账号密码连接,以及读取的master节点的哪个二进制文件,以及从第几行开始读取

change master to master_host='124.523.53.124', master_user='slave1' master_password='slave1', master_og_file='mysqlbin.000001', master_log_pos=413

⑥开启同步操作

slave中执行SQL:

start slave;  #开启同步操作

show slave status;  # 查看slave节点的状态,当slave_io_running跟slave_sql_running 都是yes时,说明同步已经成功了。

此时,mysql的主从复制同步就设置成功了。原理就是读取master节点的二进制文件,应用可以设置一主多从,每个从节点都读取master节点的二进制文件,或者slave2读取slave1的二进制文件形成链式同步也可。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值