面试题大杂烩-记不住
1、分库分表图啥分库是为了解决单库io连接数的瓶颈分表是为了解决单表效率瓶颈2、分表后如何limit分页如果是根据xxx字段进行分表的话 那么shardingjdbc会根据字段进行笛卡尔积计算 去对应表里面执行sql到内存中计算比如根据用户id进行hash算法进行查表所以满足了c端用户的订单问题。但是后台b端的话自然是期望按照时间进行排序查询这个时候b端是可以接受异步的方法查询这个时候我们可以采取方案就是异步将分表数据再存一份出来按照时间分或者将数据通Canal进行将日志监听同步到es中通过查询es来满足查询当出现根据用户分表然后后台要求根据地区进行划分的话这个时候就考虑用户id包含区域id把「区域 ID」嵌入到用户 ID 的固定位置3、mysql中节点存什么非叶子节点父节点为 主键加页号8b左右叶子节点为子节点数据一行数据大概1kb4、mysql的innodb中B树如何存储数据3次io读取更多数据是走的主键筛选的如果有一个user表则对应的就有user.idb文件文件中存的结构就是b树一页存储大概为16kb当超过了一页后叶分裂将排序并将大的页数据分离出来将根节点中变为非叶子节点将两页中最小id扔在根节点上下图中红色的为主键下图为分裂后的图片当一行数据超过了一页怎么办这个时候分裂在按下一页查询的时候是会根据页头跟页尾进行判断这条数据是否完整或者断电后存储是否完整不完整就找下页去拼完整数据计算规则一行1kb的话3次io就会查到上千万条数据并且很快计算规则就是z层级次数几层树x头节点一般主键页数大概一页可以存1280根目录可以存多少条k叶子节点单页存多少条子节点一页可以存多少条最终结果x的z-1次方 * k也就是上述数据的1280的3-1次方 x 155. 聚簇索引(聚集索引和非聚簇索引非聚集索引区别就是一个是主键一个不是如果这个索引不包含你要查询的结果集中任意一个属性都要回表通过主键id去查询数据所在地方一般非聚簇索引存储的叶子节点不会是整行数据而是聚簇索引键值6. in和existsin是把外表和内表作hash连接而exists是对外表作loop循环每次loop循环再对内表进行查询子查询表大的用exists子查询表小的用in表A(小表)表B(大表)select * from A where cc in(select cc from B)如果内表比较大的话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 其中缓冲池发生变化会同步的在日志中记录是顺序的iowal意思就是先写日志redo log物理日志蓝色的文件是有两份的在循环写隔段时间清理一下发生事故那么就可以通过redo log恢复undo log逻辑日志记录的是事务可以根据回滚进行根据逻辑日志回滚保证事务原子性区别10、mvccMVCC全称为Multi-Version Concurrency Control多版本并发控制是数据库管理系统DBMS中一种用于管理并发访问数据的技术。MVCC的主要目标是允许多个事务同时访问数据库而不会导致数据不一致或冲突。它通常用于支持事务性数据库系统如关系型数据库管理系统RDBMS。MVCC的核心思想是为每个事务创建一个独立的数据版本而不是在原始数据上直接进行修改。这意味着每个事务看到的数据是基于其自己的开始时间点或快照时间点来确定的而不会受到其他事务的影响。这样可以实现高度的并发性同时确保数据的一致性和隔离性。MVCC的主要组成部分包括以下几个概念版本号每个数据行都有一个或多个与之关联的版本号用于标识该数据的不同版本。事务开始时间戳和结束时间戳每个事务都有一个开始时间戳和一个结束时间戳用于确定事务的活动时间范围。快照读取当一个事务需要读取数据时它将根据自己的开始时间戳来选择适当版本的数据。这意味着一个事务不会看到在它开始之后或者结束之前进行的其他事务对数据的修改。版本维护当事务对数据进行修改时不会直接在原始数据上进行修改而是创建一个新的版本同时更新事务的时间戳信息。回滚和垃圾收集当事务失败或者完成后不再需要的数据版本将被回收以减少存储空间的占用。MVCC有助于提高数据库的并发性和性能因为它允许多个事务同时进行读取操作而不会相互干扰。它也提供了高度的隔离性因为每个事务都有自己的数据视图不会看到其他事务的中间状态。这使得MVCC在支持事务的数据库系统中广泛使用11、update执行流程内存操作先加载数据页到Buffer Pool写Undo Log为回滚和MVCC做准备再修改内存数据。WAL机制写Redo Log再写Binlog最后写Commit标记。这是性能的关键。两阶段提交重点讲清楚为什么需要保证Redo Log和Binlog的崩溃一致性以及崩溃恢复时的处理逻辑- 有Prepare无Binlog → 回滚有Prepare有Binlog → 自动提交异步落盘数据最终由后台线程刷盘与客户端返回成功是异步的。