MySQL相关
mysql-悲观锁
使用select...for update,就实现了。zhelyao注意,mysql的select...for update语句,会把所有扫描的行都锁上,所以在mysql中使用悲观锁,我们必须要确定走了索引,不然可能会全表扫描,锁住整个表。
mysql-乐观锁
在我们要修改前,先查询一个这个值和一个自己维护的版本号,记录下来之后,处理完数据,最后要修改的时候,在where中加入判断,只有值没变且版本号不变才修改。
mysql-索引
索引的分类有五种主键索引、唯一索引、普通索引、全文索引、组合索引
索引可以帮助我们加快查询的速度,减少了扫描的数据类,把随机io变成了顺序io。
对于mysql索引底层的数据结构,就大部分的存储引擎,比如Innodb,MyISAM,都是利用B+树,官方文档里写的是B树,但是实际上使用是B+树,它是B树的一种延伸.还有一种memory存储引擎他使用的数据结构是哈希表。
当然索引也有缺点,创建索引和维护索引要耗费时间,并且当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执⾏效率。
mysql-为什么用b+树不用b树
我们希望查数据尽量的快,那么对于树来说,肯定深度要尽量低。所以我们采用有序多叉树而不是有序二叉树。
B树是在每个节点都存放所有数据,所以节点上存储的索引数变少了,而b+树只在叶子节点存储数据,同样一个数据页b+树可能存更多的索引,也就使得树的深度变低了
mysql-聚簇索引
叶子节点存放数据,就是聚簇索引,叶子节点存放主键的id,那么是非聚簇索引。也就意味着,聚簇索引将数据存储与索引放到了⼀块,找到索引也就找到了数据
在innodb中,由主键创建的索引是聚簇索引,其他索引都是非聚簇索引,在myisam中,都是非聚簇索引。
mysql-严格模式
简单来说就是MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错。
mysql-读写分离
主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。
原理:
①当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
②salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
③当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
④I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。
⑤SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。
优点:
数据分布:随意开始或停⽌复制,并在不同地理位置分布数据备份
负载均衡:降低单个服务器的压⼒ ⾼可⽤和故障切换:
帮助应⽤程序避免单点失败
实现:
以一主二从为例子
1、首先创建两个用户,给从机用。找到主机的mysql配置文件,写入一些配置,然后重启mysql
2、找到从机的配置文件,写入配置
3、从机用刚才的用户账号密码登录主机,输入一些命令
4、重启从机服务,我们可以用show slave status \G命令查看是否配置成功
mysql-分库分表
当使用分库分表的时候,说明我们的数据库应该面临很高的并发访问了,且单表数据量到达了百万级。
分库的话,就是把库拆的更细一点。
分表有分为水平分表和垂直分表
水平分表: 解决单表记录太大问题,我们可以某个字段分,或者如果是日志类,统计类的表,按照日期分表。
垂直分表:解决列过多的问题,把常用查询的列放到一个表,其余的字段单独再放一个表。常用查询的表我们可以考虑用memory
我记得Apache旗下有个顶级项目,还是专门来分库分表的一个软件,叫ShardingSphere。
mysql-innodb和myisam区别
innodb直接表锁和行锁,myisam只支持表锁
innodb支持事务,myisam不支持
innodb支持聚簇索引
innodb支持外检,myisam不支持
mysql-存储引擎是什么
不同的数据文件在磁盘的不同组织形式,比如说innodb在文件上存储的是两个文件分别是frm,ibd,myisam在文件上存储的是frm,myi,myd
mysql-mvcc
mysql-读写分离数据一致性问题
mysql-主从搭建
简单搭建原理:
1、两个主机上都安装好MySQL服务
2、配置主机的MySQL配置文件、配置从机的MySQL配置文件 使得他们相关的配置文件信息能够在链接的时候对接上;
3、确保主机ip和从机ip在同一网段,即在局域网内;
4、在从机上执行链接信息命令,让从机主动连接主机,由于配置文件的信息校验通过,主机允许从机访问主机MySQL服务从而实现主从结构;
mysql-大数据量分页查询优化
在mysql中,使用limit分页,随着页码增大,效率变低,查询时间和起始记录的位置成正比。
优化1:利用表的索引覆盖加速分页。我们知道,利用索引查询的语句中如果只包含了索引列,那查询会很快。
select id from collect order by id limit 90000,10;
mysql-redis作为缓存导致的双写一致性问题
看博客。