MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。
mysql的全复制、半复制、异步复制
异步复制
mysql默认的就是异步复制。主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经 接收并处理。主库将事务 Binlog 事件写入到 Binlog 文件中,此时主库只是通知 Dump 线程发送这些新的 Binlog, 然后主库就会继续处理提交操作,并不保证这些 Binlog 传到任何一个从库节点上。这样就会存在一个问题,如果主 库出现故障,此时主库已经提交的事务可能并没有传到从库上,可能导致数据丢失。
全复制
当主库提交事务之后,所有的从库节点必须收到、APPLY并且提交这些事务,然后主库线程才能继续做后续操作。因 为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
半同步复制
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库 接收到并写到 relay log 中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一 定程度的延迟。 半同步复制的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个 事务,都要求至少有一个备库成功接收后,才返回给用户。实现原理也很简单,主库本地执行完毕后,等待备库的响 应消息(包含最新备库接收到的binlog(file,pos)),接收到备库响应消息后,再返回给用户,这样一个事务才算 真正完成。在主库实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已 经接收的日志,可以继续执行。安装一个插件,然后设置mysql的参数即可。
mysql半同步复制的特点
- 从库会在连接到主库时告诉主库,它是不是配置了半同步。
- 如果半同步复制在主库端开启,并且至少有 一个半同步复制的从库节点,那么此时主库的事务线程在提交时会被阻塞并等待,结果有两种可能:
- 至少一个 从库节点通知它已经收到了所有这个事务的Binlog事件;
- 一直等待直到超过配置的某一个时间点为止,此时, 半同步复制将自动关闭,转换为异步复制。
- 从库节点只有在接收到某一个事务的所有 Binlog,将其写入到 Relay Log 文件之后,才会通知对应主库上面的等待线程。
- 如果在等待过程中,等待时间已经超过了配置的超 时时间,没有任何一个从节点通知当前事务,那么此时主库会自动转换为异步复制,当至少一个半同步从节点赶上来 时,主库便会自动转换为半同步方式的复制。
- 半同步复制必须是在主库和从库两端都开启时才行,如果在主库 上没打开,或者在主库上开启了而在从库上没有开启,主库都会使用异步方式复制。
drop,delete与truncate的区别
- truncate和delete只删除数据不删除表的结构(定义),而drop语句将删除表的结构被依赖的约束(constrain),触发 器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。
- delete命令是DML,删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复。 而truncate,drop命令是DDL,删除的数据是操作立即生效,原数据不放到rollback segment中,不能回滚,数据不 可以回滚恢复。
- delete命令,不会自动提交事务,操作会触发trigger;而truncate,drop命令,执行后会自动提交事务,操作不 触发trigger。
- 速度:一般来说:drop > truncate > delete
- drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字 句。
什么情况下应不建或少建索引
- 数据量太少的不建议建立索引
- 经常插入、删除、修改的表,需要减少索引,不要建太多
- 数据重复且分布平均的表字段,比如一个列的值只有0和1 这种就不要建立了。
创建数据库表要注意什么?
- 字段名要见名知意,不要乱起。
- 字段的大小分配要认真考虑,要尽量减少空间,合理安排
- 要考虑是否有并发场景,需要建立version字段
- 用varchar代替char,动态分配长度
- 避免表有null,最好都搞默认值,索引查询会非常有效