笔记-数据库部分

mysql分库分表使用及为什么使用
问题:
1.用户请求量太大:因为单服务器TPS,内存,IO都是有限的.解决方法:分散请求到多个服务器上;其实用户请求和执行一个sql查询是本质是一样的,都是请求一个资源,只是用户请求还会经过网关,路由,http服务器等
2.单库太大:单个数据库处理能力有限;单库所在服务器上磁盘空间不足;单库上操作的IO瓶颈.解决方法:切分成更多更小的库
3.单表太大:CRUD都成问题;索引膨胀,查询超时.解决方法:切分成多个数据集更小的表.
使用:
1.垂直拆分
a.垂直分表:就是”大表拆小表”,基于列字段进行的.一般是表中的字段较多,将不常用的,数据较大,长度较长(比如text类型字段)的拆分到”扩展表”. 一般是针对那种几百列的大表,也避免查询时,数据量太大造成的”跨页”问题.
b.垂直分库:垂直分库针对的是一个系统中的不同业务进行拆分.切分后,要放在多个服务器上,而不是一个服务器上.数据库业务层面的拆分,和服务的”治理”,”降级”机制类似,也能对不同业务的数据分别的进行管理,维护,监控,扩展等.数据库往往最容易成为应用系统的瓶颈,而数据库本身属于”有状态”的,相对于Web和应用服务器来讲,是比较难实现”横向扩展”的.数据库的连接资源比较宝贵且单机处理能力也有限,在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈.
2.水平拆分
a.水平分表:针对数据量巨大的单张表,按照某种规则(RANGE,HASH取模等),切分到多张表里面去.但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈.不建议采用
b.水平分库分表:将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同.水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈

索引的常见实现方式有哪些,区别
常见索引:Hash索引、B+Tree索引
区别:
1:Hash索引在mysql中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引,是Memory表的默认索引类型,尽管Memory表也可以使用B+Tree索引.Hash索引把数据以hash形式组织起来,因此当查找某一条记录的时候,速度非常快.但是因为hash结构,每个键只对应一个值,而且是散列的方式分布.所以它并不支持范围查找和排序等功能.
2.B+Tree是mysql使用最频繁的一个索引数据结构,是Innodb和Myisam存储引擎模式的索引类型.相对Hash索引,B+Tree在查找单条记录的速度比不上Hash索引.但是因为更适合排序等操作,所以它更受欢迎.毕竟不可能只对数据库进行单条记录的操作.
3.带顺序访问指针的B+Tree,B+Tree所有索引数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针.提高了区间效率,大大减少了磁盘I/O读取

MySQL的存储引擎有哪些,选择
1.MyISAM存储引擎:MyISAM基于ISAM存储引擎,并对其进行扩展.它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一.MyISAM拥有较高的插入、查询速度,但不支持事务
2.InnoDB存储引擎:InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键
3.MEMORY存储引擎:MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问
4.Archive存储引擎
选择:
a.InnoDB:如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
b.InnoDB和MyISAM之间的区别:
①InnoDB支持事物,而MyISAM不支持事物
②InnoDB支持行级锁,而MyISAM支持表级锁
③InnoDB支持MVCC,而MyISAM不支持
④InnoDB支持外键,而MyISAM不支持
c.MyISAM:如果数据表主要用来插入和查询记录,则MyISAM(但是不支持事务)引擎能提供较高的处理效率
d.Memory:如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果.数据的处理速度很快但是安全性不高
e.Archive:如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的.Archive非常适合存储归档数据,如记录日志信息可以使用Archive

聚簇索引和非聚簇索引
1.聚集索引与非聚集索引的区别是:叶节点是否存放一整行记录
2.InnoDB主键使用的是聚簇索引,MyISAM不管是主键索引,还是二级索引使用的都是非聚簇索引
聚簇索引的优点:
a.当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好
b.当通过聚簇索引查找目标数据时理论上比非聚簇索引要快,因为非聚簇索引定位到对应主键时还要多一次目标记录寻址,即多一次I/O
c.使用覆盖索引扫描的查询可以直接使用页节点中的主键值
聚簇索引的缺点:
a.插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能.因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
b.更新主键的代价很高,因为将会导致被更新的行移动.因此,对于InnoDB表,我们一般定义主键为不可更新
c.二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据.二级索引的叶节点存储的是主键值,而不是行指针(非聚簇索引存储的是指针或者说是地址),这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间
d.采用聚簇索引插入新值比采用非聚簇索引插入新值的速度要慢很多,因为插入要保证主键不能重复,判断主键不能重复,采用的方式在不同的索引下面会有很大的性能差距,聚簇索引遍历所有的叶子节点,非聚簇索引也判断所有的叶子节点,但是聚簇索引的叶子节点除了带有主键还有记录值,记录的大小往往比主键要大的多.这样就会导致聚簇索引在判定新记录携带的主键是否重复时进行昂贵的I/O代价

mysql查询优化
1.避免向数据库请求不需要的数据
2.查询数据的方式(由慢到快:全表扫描;索引扫描;范围扫描;唯一索引查询;常数引用等)
3.分解大的查询
4.优化MIN()和MAX()
5.用IN()取代OR
6.优化关联查询
7.临时表概念,对于UNION查询,MySql先将每一个单表查询结果放到一个临时表中,然后再重新读出临时表数据来完成UNION查询.MySql读取结果临时表和普通表一样,也是采用的关联方式.
8.排序优化
9.子查询优化
10.优化COUNT()查询
11.优化LIMIT分页
12.优化UNION查询

B+树和B树,联合索引
B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.这个数据结构一般用于数据库的索引,综合效率较高.B树的优势在于多路查找
B+Tree是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构.数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址.相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可.而B-Tree需要获取所有节点,相比之下B+Tree效率更高
联合索引:两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c).可以支持a a,b a,b,c 3种组合进行查找,但不支持b,c进行查找.当最左侧字段是常量引用时,索引就十分有效

mysql的悲观锁和乐观锁区别
1.概念上的区别:
a.乐观锁(Optimistic Locking):顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,”乐观”的认为加锁一定会成功的,在最后一步更新数据的时候再进行加锁
b.悲观锁(Pessimistic Lock):正如其名字一样,悲观锁对数据加锁持有一种悲观的态度.因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)
2.实现方式:
a.乐观锁:
①version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一.当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功
②CAS操作方式:即compare and swap或者compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值.当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试
b.悲观锁:是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了(原理:共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程),如行锁、读锁和写锁等,都是在操作之前加锁
3.使用场景:
a.乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量
b.悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量
4.特点:
a.乐观锁:乐观锁的特点先进行业务操作,不到万不得已不去拿锁.即”乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好
b.悲观锁:悲观锁的特点是先获取锁,再进行业务操作,即”悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作.通常所说的”一锁二查三更新”即指的是使用悲观锁

ABA问题的解决
再加一个字段进行比较,例如新加了一个字段version,AB两个事务同时select出来的version都为0,当A修改后提交时候将version修改为1并保存(UPDATE…WHERE id = 1 AND version = oldVersion),事务B要提交修改的时候比较自己的version与数据库里的version值,如果一样(WHERE 条件满足),可以直接将本次的提交存下来,否则就将再次获取数据库里的数据,重新进行修改、提交

Redis和MySQL有什么区别
1.数据库类型
a.MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢
b.Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
2.作用:MySQL用于持久化的存储数据到硬盘,功能强大,但是速度较慢;Redis用于存储使用较为频繁的数据到缓存中,读取速度快.
3.需求:MySQL和Redis因为需求的不同,一般都是配合使用
4.场景选择:Redis和MySQL要根据具体业务场景去选型
5.存放位置:MySQL数据放在磁盘;Redis数据放在内存
6.适合存放数据类型:Redis适合放一些频繁使用,比较热的数据,因为是放在内存中,读写速度都非常快,一般会应用在下面一些场景:排行榜、计数器、消息队列推送

Redis的持久化方式
快照(RDB文件)、追加式文件(AOF文件)

redis单线程优势 问题
主要优势单线程,避免线程切换产生静态消耗,缺点是容易阻塞,虽然redis使用io复用epoll和输入缓冲区把命令按照队列先进先出输入等等