1、分库分表图啥
-
- 分库是为了解决单库io连接数的瓶颈
-
- 分表是为了解决单表效率瓶颈
2、分表后如何limit分页
-
- 如果是根据xxx字段进行分表的话 那么shardingjdbc会根据字段进行笛卡尔积计算 去对应表里面执行sql到内存中计算,比如根据用户id进行hash算法进行查表,所以满足了c端用户的订单问题。
-
- 但是后台b端的话自然是期望按照时间进行排序查询,这个时候b端是可以接受异步的方法查询,这个时候我们可以采取方案就是异步将分表数据再存一份出来按照时间分,或者将数据通Canal进行将日志监听同步到es中,通过查询es来满足查询
3、mysql中节点存什么
-
- 非叶子节点(父节点)为 :主键加页号(8b左右)
-
- 叶子节点为(子节点):数据(一行数据大概1kb)
4、mysql的innodb中B+树如何存储数据
-
- 如果有一个user表,则对应的就有user.idb文件
-
- 文件中存的结构就是b+树
-
- 一页存储大概为16kb,当超过了一页后,叶分裂(将排序并将大的页数据分离出来,将根节点中变为非叶子节点,将两页中最小id扔在根节点上)
下图中红色的为主键,下图为分裂后的图片
- 一页存储大概为16kb,当超过了一页后,叶分裂(将排序并将大的页数据分离出来,将根节点中变为非叶子节点,将两页中最小id扔在根节点上)
-
- 当一行数据超过了一页怎么办,这个时候分裂在按下一页,查询的时候是会根据页头跟页尾进行判断这条数据是否完整,或者断电后存储是否完整,不完整就找下页去拼完整数据
-
- 计算规则,一行1kb的话,3次io就会查到上千万条数据,并且很快,计算规则就是
z:层级次数(几层树)
x:头节点(一般主键,页数,大概一页可以存1280,根目录可以存多少条)
k:叶子节点单页存多少条(子节点一页可以存多少条)
最终结果:x的z-1次方 * k
也就是上述数据的1280的3-1次方 x 15
- 计算规则,一行1kb的话,3次io就会查到上千万条数据,并且很快,计算规则就是
5. 聚簇索引(聚集索引)和非聚簇索引(非聚集索引)
-
- 区别就是:一个是主键,一个不是
-
- 如果这个索引不包含你要查询的结果集中任意一个属性,都要回表(通过主键id去查询数据所在地方)
-
- 一般非聚簇索引存储的叶子节点不会是整行数据,而是聚簇索引键值
6. in和exists
-
- in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询
-
- 子查询表大的用exists,子查询表小的用in;
表A(小表),表B(大表)
select * from A where cc in(select cc from B)
如果内表比较大的话in效率会低
- 子查询表大的用exists,子查询表小的用in;
7、引用方面何时gc
-
- 强引用无法gc 除非引用变为Null
-
- 软引用内存不够就gc掉
-
- 弱引用只要gc就会被回收
-
- 虚引用随时都会被回收get方法是Null返回
8、关于tcp,沾包和半包
9、mysql缓冲池和redo log和undo log
其中mysql不是从ibd去进行需改表数据的,二十讲ibd读到缓冲池中,修改完成后同步到ibd中。
产生问题就是在缓冲池基于内存修改完成后同步到磁盘的时候,服务器挂掉了,这些数据咋办
- 为什么不直接采用同步到ibd中
对磁盘不如对内存快,,并且非顺序的io性能慢
- 那如何解决
redo log 其中缓冲池发生变化会同步的在日志中记录,是顺序的io(wal意思就是先写日志)
redo log物理日志
蓝色的文件是有两份的,在循环写,隔段时间清理一下
发生事故那么就可以通过redo log恢复
undo log逻辑日志
记录的是事务,可以根据回滚进行根据逻辑日志回滚保证事务原子性
区别
10、mvcc
MVCC,全称为Multi-Version Concurrency Control(多版本并发控制),是数据库管理系统(DBMS)中一种用于管理并发访问数据的技术。MVCC的主要目标是允许多个事务同时访问数据库,而不会导致数据不一致或冲突。它通常用于支持事务性数据库系统,如关系型数据库管理系统(RDBMS)。
MVCC的核心思想是为每个事务创建一个独立的数据版本,而不是在原始数据上直接进行修改。这意味着每个事务看到的数据是基于其自己的开始时间点或快照时间点来确定的,而不会受到其他事务的影响。这样可以实现高度的并发性,同时确保数据的一致性和隔离性。
MVCC的主要组成部分包括以下几个概念:
-
版本号:每个数据行都有一个或多个与之关联的版本号,用于标识该数据的不同版本。
-
事务开始时间戳和结束时间戳:每个事务都有一个开始时间戳和一个结束时间戳,用于确定事务的活动时间范围。
-
快照读取:当一个事务需要读取数据时,它将根据自己的开始时间戳来选择适当版本的数据。这意味着一个事务不会看到在它开始之后或者结束之前进行的其他事务对数据的修改。
-
版本维护:当事务对数据进行修改时,不会直接在原始数据上进行修改,而是创建一个新的版本,同时更新事务的时间戳信息。
-
回滚和垃圾收集:当事务失败或者完成后,不再需要的数据版本将被回收,以减少存储空间的占用。
MVCC有助于提高数据库的并发性和性能,因为它允许多个事务同时进行读取操作,而不会相互干扰。它也提供了高度的隔离性,因为每个事务都有自己的数据视图,不会看到其他事务的中间状态。这使得MVCC在支持事务的数据库系统中广泛使用