mysql学习笔记

 

主从复制 replication:主库备库,大规模高性能应用的基础。水平扩展。

原理:

1、基于sql语句的复制。优点:简单方便;缺点:有些sql不能被正确记录,串行化更新,需要跟多的锁,数据量会很巨大。

2、基于行的复制。缺点:一条sql可以记录的会出现大量的日志记录,浪费空间。

3、采用了io线程和sql线程异步处理。

 

涉及到的文件:二进制binary日志 ,中继日志(备库中 )

 

可能存在的问题:

1、myisam引擎的表 主库在运行sql的时候突然被中断,会导致备库执行完整,主库没有执行完整。

应对方法:中断之前需要确保stop slave。

2、尽量采取规范化的做法,这样能避免常见的问题。

备库只读,

使用工具 percona 工具的使用。

 

mysql实战经验:

1、5.6以前如果修改表结构,对于大数据量表的操作非常耗时,因为会对表创建临时表拷贝数据再删除旧表,有100w条数据就要拷贝100w次,插入100w次。所以对于有大量数据的表ddl的时候要考虑周全。

2、大数据分页使用deffed join :延迟关联,原理是覆盖索引。

3、高版本mysql5.6 可以开启mrr 和cip 以支持范围查询和like查询。

一般来说项目中用到的比较多的是范围查询和like查询,这个特性可以说让mysql的索引能力提高很多。

4、多个inner join 拆分。mysql本身有缓存的机制。可以对单个表查询的数据进行缓存。

多个join 的关联操作表的链接顺序很重要,一般来说mysql会自己对sql进行优化,但是如果你发现不大好的时候,可以使用关键字straight_join来重拍关联顺序。

5、全文索引,sphinx。高版本已经支持了全文索引innodb。

 

6、datetime timestamp的区别:

1、都可以标识为 yyyy-mm-dd HH:ii:ss格式的数据

2、mysql5.6版本以后(包括)才可以为datetime设置默认值; timestamp可以设置默认值 current_timestamp,但是一个表只能为其中一个设置默认值,有数量限制。5.6以后都可以设置默认值,没有数量限制。

3、datetime没有时间范围的限制1000 - 9999,timestamp 1970-2037。

4、datetime 8个字节 timestamp 4个字节。

7、秒杀场景mysql解决

innodb隔离级别是重复读(可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)),但是并不能控制库存减为0,所以减库存之后需要加判断,是否<0(这里可以查询到最终减到的值),即先更新后查询,小于0后回滚。这是数据库层面做的事。

redis setnx加锁,如果当前有锁,则提示进不去,这是在程序层面加锁实现。

redis作为缓冲层,设置库存数量,当库存数量减为0时就拦截后面的所有的用户。

 

 

 

 

 

 

 

你可能感兴趣的:(mysql学习笔记)