实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)
主从复制原理:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
mysql的日志类型:
Error log 错误日志
General query log普通查询日志
Slow query log 慢查询日志(记录哪些查询比较慢 )
Binary log二进制日志文件(1、用于增量备份。2、主从)
要实现MySQL的主从复制,首先必须打开Master端的Binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave从Master端获取BInlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中记录的各种SQL操作。
1.传统的实现数据库主从复制
单向复制,只能slave复制master的,即slave对master库只读
base2 172.25.78.12 master
base3 172.25.78.13 slaver
# 在master上
[root@base2 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@base2 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm
mysql-community-test-5.7.24-1.el7.x86_64.rpm
[root@base2 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm \
mysql-community-common-5.7.24-1.el7.x86_64.rpm \
mysql-community-libs-5.7.24-1.el7.x86_64.rpm \
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm \
mysql-community-server-5.7.24-1.el7.x86_64.rpm # 只需要这五个即可
[root@base2 ~]# vim /etc/my.cnf
log-bin=mysql-bin # 启用二进制功能,主从复制基础
server-id=1 # id唯一
[root@base2 ~]# systemctl start mysqld
[root@base2 ~]# cat /var/log/mysqld.log | grep password # 查看临时密码
[root@base2 ~]# mysql -p # 我们可以用临时密码登录数据库,但是什么都干不了
Enter password:
mysql> show databases;
[root@base2 ~]# mysql_secure_installation # 初始化密码
[root@base2 ~]# mysql -p # 再次登录,可以正常使用
Enter password:
mysql> show databases;
mysql> grant replication slave on *.* to repl@'172.25.78.%' identified by 'Ting@666'; # 为服务器创建一个连接账户并授予权限,*.*表示所有权限;172.25.78.%表示这个网段的所有用户都有这个权限
mysql> show master status;
# 在slave上
先测试master数据库是否能远程登录
[root@base2 ~]# mysql -h 172.25.78.12 -u repl -p
Enter password:
mysql> show databases; # 测试成功
mysql> quit
1
开始配置slave的数据库
[root@base3 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@base3 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm \
mysql-community-common-5.7.24-1.el7.x86_64.rpm \
mysql-community-libs-5.7.24-1.el7.x86_64.rpm \
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm \
mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@base3 ~]# vim /etc/my.cnf
server-id=2
注:从服务器 ID 号,不能和主 ID 相同,如果设置多个从服务
器,每个从服务器必须有一个唯一的 server-id 值,必须与主服
务器的以及其它从服务器的不相同。可以认为 server-id 值
类似于 IP 地址:这些 ID 值能唯一识别复制服务器群集中的
每个服务器实例。
[root@base3 ~]# systemctl start mysqld
[root@base3 ~]# cat /var/log/mysqld.log | grep password
[root@base3 ~]# mysql_secure_installation # 初始化密码
[root@base3 ~]# mysql -p
mysql> change master to master_host='172.25.78.12',master_user='repl',master_password='Ting@666',master_log_file='mysql-bin.000002',master_log_pos=1003; # 从库和主库建立连接,必须和主服务器里查看到的数据保持一致
mysql> start slave;
mysql> show slave status\G;
#在master上创建数据库
[root@base2 ~]# mysql -p
Enter password:
mysql> create database test;
mysql> use test;
mysql> create table userlist(
-> username varchar(15) not null,
-> password varchar(25) not null);
mysql> desc userlist;
mysql> insert into userlist values ('userq','111');
mysql> insert into userlist values ('user1','222');
mysql> select * from userlist; # 建立成功
# 在slave上查看是否同步
[root@base3 ~]# mysql -p
Enter password:
mysql> show databases;
mysql> use test;
mysql> show tables;
mysql> select * from userlist; # 同步成功
2.gtid实现主从复制
相比于传统的主从复制优点:不需要知道复制哪个文件,也不需要知道从哪个号开始复制
# 在master上
[root@base2 ~]# vim /etc/my.cnf
log-bin=mysql-bin
server-id=1
gtid_mode =ON
enforce-gtid-consistency=true
[root@base2 ~]# systemctl restart mysqld
[root@base2 ~]# mysql -p
Enter password:
mysql> grant replication slave on *.* to repl@'172.25.78.%' identified by 'Ting@666'; # 为服务器创建一个连接账户并授予权限,*.*表示所有权限;172.25.78.%表示这个网段的所有用户都有这个权限
# 在slave上
[root@base3 ~]# vim /etc/my.cn
server-id=2
gtid_mode =ON
enforce-gtid-consistency=true
[root@base3 ~]# systemctl restart mysqld
[root@base3 ~]# mysql -p
Enter password:
mysql> stop slave;
mysql> change master to master_host='172.25.78.12',master_user='repl',master_password='Ting@666',MASTER_AUTO_POSITION=1; # 改变slave服务器用于连接master服务器的参数,此处把MASTER值设为动态
mysql> start slave;
mysql> show slave status\G;
# 在master上创建数据库
mysql> show master status; # 数据已经改变
mysql> create database westos;
mysql> show databas
# 在slave端查看是否同步
mysql> show databases;
[root@base3 ~]# mysql -p
Enter password:
mysql> use mysql;
mysql> show tables;
mysql> select * from gtid_executed;
[root@base3 ~]# cd /var/lib/mysql
[root@base3 mysql]# ls
mysql主从复制存在的问题:
1.主库宕机后,数据可能丢失
2.从库只有一个sql Thread,主库写压力大,复制很可能延时
# 解决方法:
1.半同步复制----解决数据丢失的问题
2.并行复制----解决从库复制延迟的问题
4.基于gtid实现半同步
关于半同步:
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后
不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才
返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时
它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。
所以,半同步复制最好在低延时的网络中使用。
# 在master上
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; # 下载插件
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; # 查看插件是否加载成功
mysql> show global variables like '%semi%';
mysql> set global rpl_semi_sync_master_enabled=1; # 设置变量,启用半同步复制,这是临时设置,永久设置需要编辑文件/etc/my.cnf写入rpl_semi_sync_master_enabled=1
mysql> show global variables like '%semi%';
mysql> show global status like '%semi%'; # 可以用这些参数进行监控
mysql> show status like 'Rpl_semi_sync_master_status'; # 查看半同步是否在运行
# 配置slave服务器
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; # 下载插件
mysql> set global rpl_semi_sync_slave_enabled=1; # 设置变量,启用半同步复制
mysql> stop slave IO_THREAD; # 重启slave上的IO线程,重启后,slave会在master上注册为半同步复制的slave角色,否则还是异步复制
mysql> start slave IO_THREAD;
mysql> show global variables like '%semi%';
mysql> show status like 'Rpl_semi_sync_slave_status'; # 查看半同步是否在运行
# 测试:
(1)在Slave执行stop slave后,master的create操作需要10.76s才返回,而这与rpl_semi_sync_master_timeout参数的时间相吻合。
在slave上
mysql> stop slave;
mysql> show status like 'Rpl_semi_sync_slave_status';
在master上
mysql> create database student;
mysql> show global status like '%semi%';
(2)在Slave执行stop slave之前,master的drop操作很快就能返回。
在slave上
mysql>mysql> start slave IO_THREAD;
mysql> show databases; # 当slave启动时,数据会自动同步,不会丢失
mysql> show status like 'Rpl_semi_sync_slave_status';
在master上
mysql> drop database student;
事实上,半同步复制并不是严格意义上的半同步复制,当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。
5.基于gtid实现并行复制
为什么会出现并行复制呢?
因为在5.7的mysql生产环境中,slave端进行复制时,IO线程和SQL线程都是单线程,而master端
是多线程,多新城肯定比单线程快的多,这就出现了复制延迟的问题,我们用并行复制就可以解决
这个问题,并行复制的目的就是要让slave尽可能的多线程跑起来,当然基于库级别的多线程也是
一种方式(不同库的事务,没有锁冲突)
# 在slave端
[root@base3 ~]# vim /etc/my.cnf
slave-parallel-type=LOGICAL_CLOCK # 并行的类型
slave-parallel-workers=5 # 开启多少个线程
master_info_repository=TABLE # maste.info和relay.info是以表的形式存储的
relay_log_info_repository=TABLE # 存储日志以表的形式
relay_log_recovery=ON # 支持恢复
[root@base3 ~]# systemctl restart mysqld
[root@base3 ~]# mysql -p
Enter password:
mysql> show processlist;
6.组复制
MySQL 组复制实现了基于复制协议的多主更新。
1)复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读
写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。
一.特点:
● 高一致性
基于原生复制及 paxos 协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
● 高容错性
只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
● 高扩展性
节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
● 高灵活性
有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;
多主模式下,所有 server 都可以同时处理更新操作。
二、什么样的应用场景适合用组复制?
1、弹性的数据库复制环境
组复制可以灵活的增加和减少集群中的数据库实例
2、高可用的数据库环境
组复制允许数据库实例宕机,只要集群中大多数服务器可用,则整个数据库服务可用
3、替代传统主从复制结构的数据库环境
base2 172.25.78.12 master1
base3 172.25.78.13 master2
base4 172.25.78.14 master3
恢复环境,准备重新初始化
# base2上
[root@base2 ~]# systemctl stop mysqld
[root@base2 ~]# cd /var/lib/mysql
[root@base2 mysql]# rm -fr *
[root@base2 mysql]# ps ax | grep mysqld # 确保没有mysqld进程
[root@base2 mysql]# uuidgen # 随机生成uuid
e3c782ed-8970-4905-a7f8-1d0547d81f0c
[root@base2 mysql]# vim /etc/my.cnf
server_id=1
gtid_mode=ON # 启用二进制日志
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON # 开启日志同步
log_bin=binlog
binlog_format=ROW # 二进制日志格式
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="e3c782ed-8970-4905-a7f8-1d0547d81f0c" # 这是随机生成的,但是一旦设定,uuid就是确定的
loose-group_replication_start_on_boot=off # 开机不启动
loose-group_replication_local_address="172.25.78.12:24901" # 绑定本地的172.25.78.12以及24901端口接受其他组成员的连接
loose-group_replication_group_seeds="172.25.78.12:24901,172.25.78.13:24901,172.25.78.14:24901" # 组复制的成员
loose-group_replication_bootstrap_group=off # 配置不自动引导组
loose-group_replication_ip_whitelist="127.0.0.1,172.25.78.0/24" # 允许网段
loose-group_replication_enforce_update_everywhere_checks=ON # 更新检测
loose-group_replication_single_primary_mode=OFF # 设置组自动选择一个 server 来处理读/写工作。
[root@base2 mysql]# systemctl start mysqld # 开启数据库
[root@base2 mysql]# cat /var/log/mysqld.log | grep password # 获取初始密码
[root@base2 mysql]# mysql -p # 用初始密码登录数据库
Enter password:
mysql> alter user root@localhost identified by 'Ting@666'; # 修改本地用户密码
mysql> SET SQL_LOG_BIN=0; # 关闭二进制日志,避免在从服务上复制
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Ting@666'; # 赋予用户密码
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; # 授权
mysql> FLUSH PRIVILEGES; # 刷新
mysql> SET SQL_LOG_BIN=1; # 开启日志
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Ting@666' FOR CHANNEL 'group_replication_recovery'; # 配置组用户
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # 安装plugin插件
mysql> SET GLOBAL group_replication_bootstrap_group=ON; #这句只有base2,在第一次执行引导组的时候执行
mysql> START GROUP_REPLICATION; # 开启组复制
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members; # 查看组复制成员
mysql> CREATE DATABASE test: # 创建数据库
mysql> use test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL); # 创建表
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;
###### # 在base3上
[root@base3 ~]# systemctl stop mysqld
[root@base3 ~]# cd /var/lib/mysql
[root@base3 mysql]# rm -fr *
[root@base3 mysql]# vim /etc/my.cnf
server_id=2
gtid_mode=ON # 启用二进制日志
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON # 开启日志同步
log_bin=binlog
binlog_format=ROW # 二进制日志格式
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="e3c782ed-8970-4905-a7f8-1d0547d81f0c" # 这是随机生成的,但是一旦设定,uuid就是确定的
loose-group_replication_start_on_boot=off # 开机不启动
loose-group_replication_local_address="172.25.78.13:24901"
loose-group_replication_group_seeds="172.25.78.12:24901,172.25.78.13:24901,172.25.78.14:24901" # 组复制的成员
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.78.0/24" # 允许网段
loose-group_replication_enforce_update_everywhere_checks=ON # 更新检测
loose-group_replication_single_primary_mode=OFF
[root@base3 mysql]# systemctl start mysqld
[root@base3 mysql]# cat /var/log/mysqld.log | grep password
[root@base3 mysql]# mysql -p
Enter password:
mysql> alter user root@localhost identified by 'Ting@666';
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Ting@666';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Ting@666' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> START GROUP_REPLICATION;
mysql> STOP GROUP_REPLICATION;
mysql> reset master;
mysql> START GROUP_REPLICATION;
# base4上
[root@base4 ~]# ls
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
[root@base4 ~]# yum install -y *
[root@base4 ~]# vim /etc/my.cnf
server_id=3
gtid_mode=ON # 启用二进制日志
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON # 开启日志同步
log_bin=binlog
binlog_format=ROW # 二进制日志格式
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="e3c782ed-8970-4905-a7f8-1d0547d81f0c" # 这是随机生成的,但是一旦设定,uuid就是确定的
loose-group_replication_start_on_boot=off # 开机不启动
loose-group_replication_local_address="172.25.78.14:24901"
loose-group_replication_group_seeds="172.25.78.12:24901,172.25.78.13:24901,172.25.78.14:24901" # 组复制的成员
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.78.0/24" # 允许网段
loose-group_replication_enforce_update_everywhere_checks=ON # 更新检测
loose-group_replication_single_primary_mode=OFF
[root@base4 ~]# systemctl start mysqld
[root@base4 ~]# cat /var/log/mysqld.log | grep password
[root@base4 ~]# mysql -p
Enter password:
mysql> alter user root@localhost identified by 'Ting@666';
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Ting@666';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Ting@666' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> reset master;
mysql> START GROUP_REPLICATION; # 开启组复制
mysql> SELECT * FROM performance_schema.replication_group_members; # 查看组成员成员状态
mysql> show databases; # 直接查看,把master1上的数据同步成功
mysql> use test;
Database changed
mysql> show tables;
# 在master2上查看,也同步成功
mysql> use test;
Database changed
mysql> select * from t1;
# 在任意一方插入数据都可以成功,也都能查看到插入的数据
mysql> INSERT INTO t1 VALUES (2, ‘lala');
mysql> INSERT INTO t1 VALUES (3, ‘haha');
mysql> select * from t1;
实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)的更多相关文章
- 搭建基于MySQL的读写分离工具Amoeba
搭建基于MySQL的读写分离工具Amoeba: Amoeba工具是实现MySQL数据库读写分离的一个工具,前提是基于MySQL主从复制来实现的: 实验环境(虚拟机): 主机 角色 10.10.10.2 ...
- 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?
如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...
- MySQL面试 - 读写分离
MySQL面试 - 读写分离 面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 面试官心理分析 ...
- MYSQL的读写分离主从延时问题
如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...
- MySQL的读写分离与主从同步数据一致性
有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题? 高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联 ...
- Amoeba搞定mysql主从读写分离
前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...
- Amoeba实现mysql主从读写分离
Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...
- python实现mysql的读写分离及负载均衡
Oracle数据库有其公司开发的配套rac来实现负载均衡,目前已知的最大节点数能到128个,但是其带来的维护成本无疑是很高的,并且rac的稳定性也并不是特别理想,尤其是节点很多的时候. 但是,相对my ...
- MySQL ProxySQL读写分离实践
目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...
- MySQL Router实现MySQL的读写分离
1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...
随机推荐
- VS开发C++控制台应用程序(示例)
注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:控制台 3 ...
- Mybatis 映射器接口实现类的方式 运行过程debug分析
查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 <?xml version="1.0" encoding= ...
- Mysql关键字Explain 性能优化神器
Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句或是结构的性能瓶颈.在select语句之前增加explaion关键字,MySQL会在查询上设置一个标记,执行查 ...
- Beego学习笔记5:MVC-VC
MVC-VC 1> 新建一个user.go控制器,其代码如下: package controllers import ( "webapp/models" " ...
- 89.canvas制作爱心
<!DOCTYPE html> <html> <head> <title>JavaScript和html53D玫瑰花(程序员的情人节礼物)< ...
- 40、js技巧(持续更新。。。)
1.深拷贝对象: const a={name:'aaa',age:11} const b=JSON.parse(JSON.stringify(a)) 2.获取数组极值: let list = [1, ...
- 13、vue如何解决跨域问题
开发环境:配置config文件夹中index.js文件: proxyTable: { '/api': { target: 'http://10.10.1.242:8245',//后端地址 // sec ...
- VB参考
Open 语句: 能够对文件输入/输出 (I/O). Open pathname For mode [Access access] [lock] As [#]filenumber [Len=recle ...
- Python小练习:批量删除多个文件夹内的相同文件
应用场景: 下载的多个文件夹是压缩包,解压后每个文件夹都有某个网站的推广链接,想要批量的删除该文件 使用环境:win7,python3.6 代码: 1.直接用for循环 由于os.walk()方法自带 ...
- 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)
[优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...