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
- 计算规则,一行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返回