一、使用索引的优缺点?
索引就像书的目录一样可以非常快速的定位到书的页面
优点:提高查询效率,没有索引的话查询数据库表会进行全表扫描
缺点:插入慢,占用硬盘空间
二、Myisam与Innodb B+树的区别?
Myisam | Innodb | |
---|---|---|
叶子节点 | Value存放的是数据地址,通过地址去查询数据 | Value存放的是数据 |
优点 | 创建索引的时候速度比较快 | 查询数据比较快 |
缺点 | 查询数据比较慢 | 创建索引比较慢 |
三、B+树中叶子节点和非叶子节点的区别?
叶子节点 | 非叶子节点 | |
---|---|---|
区别 | 有Key和Value | 只有Key |
四、MySQL中的四种实现索引的方法比较
Hash | 平衡二叉树AVL | B树 | B+树 | |
---|---|---|---|---|
优点 | 根据hash算法查询速度非常快 | 查询效率高 | 节点可以存放多个数据,减少了树的高度和IO次数,查询效率较好 | 继承了B树的特征,多了叶子节点和非叶子节点,叶子节点间顺序存储,查询效率快且范围查询也快 |
缺点 | 数据存放是无序的,不能进行范围查询 | 可以范围查询,但是需要回旋,效率很低 | 支持范围查询,也是会回旋,效率也不高 | 因为有冗余节点数据,会比较占硬盘大小,但是优点远大于缺点 |
五、MySQL主从复制原理
六、MySQL分片集群原理
七、MySQL分片集群如何保证ID唯一?
1、UUID:不是自增的
2、雪花算法:不是自增的
3、设置步长:一开始就要定义好起始值和步长,起始值为1,2,3…步长为分片数量
八、MyCat介绍
阿里的开源框架,基于java语言编写的
反向代理真实数据库
读写分离:实现routingDatasource接口,配置动态数据源,使用aop区分读写操作
分片集群:水平拆分数据库表
Mycat有三个配置文件:
1、server.xml:Mycat的配置文件,配置账号密码等
2、schema.xml:Myvat对应的物理数据库和数据库表的配置
3、rule.xml:Mycat分片(分库分表)规则
九、水平拆分和垂直拆分的区别
垂直拆分:比如会员服务对应会员数据库和微信服务对应微信数据库,缺点:需要通过接口的形式进行通讯,不能跨库查
水平拆分:一张表存放在多个数据库中,比如有6条数据,3个数据库,每个数据库存放2条数据,使用mycat中间件同时查到三个库的数据,取模存放数据
十、多数据源与动态数据源的区别?
多数据源:分包形式
动态数据源:动态数据在jvm进行不断的切换
十一、SpringBoot动态数据源切换原理
流程:
1、使用AOP判断业务逻辑层方法的前缀,如果前缀为比如select、get、find等,findUser
2、如果是为写操作的时候会给RoutingDataSource传入一个key
配置:
1、创建读和写的数据源
2、将数据源注册到RoutingDataSource
3、只用AOP技术拦截业务逻辑层方法,判断方法的前缀是否需要读或者写
注意:
1、数据源是以Map的形式放在RoutingDataSource中的
2、使用Order(0)注解使得aop执行在事务之前
十二、Mycat实现水平分片9种策略
1、地区:通过客户端传的参数来判断地区,枚举算法,枚举文件
2、取模:根据id%数据库集群数量
十三、Mycat如何同时查询分表分库后的全部数据?
把select *from user
转换成
select * from db1_user
select * from db2_user
select * from db3_user
三条查询
如果带有where id = 1的情况下,只需要发送一条查询语句。因为1%3=1,直接从第二个数据库查
分页查询
select * from user limit 0,2
随机从一个库中进行分页查询,发送三条语句,将查询出的数据进行汇总,随机返回一组数据。
select * from user order by id desc limit 0,2
取最大的两个
十四、ShardingJdbc
当当网的开源数据库中间件
实现读写分离原理:
1、需要在配置文件配置读写分离jdbc连接全部交给ShardingJdbc,主数据库与从数据库采用二进制文件实现数据同步
2、ShardingJdbc会自动判断sql语句类型(DML或DQL),如果是DML语句的话会湖区主的jdbc连接配置进行发送请求,如果是DQL语句的话,获取从的jdbc连接发送请求
DML create/delete/update/inster
十五、ShardingJdbc与MyCat的区别
MyCat拦截客户端(dao)的所有Jdbc请求,统一转发到真实的数据库
都是解析sql,通过路由规则改写sql语句
- ShardinJdbc是一个Jar形式,在本地应用层重写Jdbc原生的方法,实现数据库分片形式
- Mycat属于服务端数据库中间件
- ShardingJdbc是一个本地的数据库中间件
有点类型ribbon与nginx实现负载均衡的区别
十六、索引为什么会失效?注意哪些事项?
十七、Mysql如何定位慢查询
十八、SQL语句优化
十九、半行同步和并行同步的区别?
二十、
二十一、
二十二、
二十三、
二十四、
二十五、
二十六、
二十七、
二十八、
二十九、
三十、
三十一、
三十二、
三十三、
三十四、
1、配置文件形式
2、实现指定接口
需要开启慢查询
默认语句在10秒内没有响应就是慢查询
从指定日志文件中读取
分片=分表分库
主从,分表分库
索引什么时候会进行IO操作
机械硬盘和固态硬盘的区别?
数据结构Hash、平衡二叉树、B树、B+树的区别?
Hash:数组长度为N,Hash值为Hash(name)=X,则存放位置为X%N的余数
平衡二叉树(AVL 三位科学家发明的):
会取中间值,比如插入1,2,3,平衡之后2会为根节点,1为左子树,3位右子树
比如主键索引,key就为主键
存在同时为叶子节点和非叶子节点的,在树的最底层
因为索引是持久化的到硬盘的,所以要查询数据要把索引从硬盘中读取出来进行比较(IO),需要消耗cpu资源
无论是shardingjdbc或者mycat都不能实现主从复制,是数据库本身自带的
磁盘IO性质
磁盘(I/O)–>内存(读到内存,在内存做比较) -->CPU
IO:把硬盘读到内存
建立索引的话会生成文件,数据多索引多文件也多
B+树的节点到底存放多少?
索引的失效问题
MySQL主从复制数据同步是多久执行一次?还是自己配置的?
监听binlog文件,每次dmlsql都同步?
mycat实现读写分离(通过权限)和分表分库
读写分离两种实现方式:
1、mycat,拦截所有jdbc请求,通锅select,update区分,路由分析,客户端通过公网ip去访问mycat,mycat上有虚拟数据库
2、动态数据源aop,拦截service方法
通过find等自己设置的方法头区分
动态数据源与多数据源的区别?
动态数据源包含多数据源
SpringBoot连接Mycat中的虚拟数据库,通过Mycat去访问其他数据库
云数据库
阿里云、腾讯云等,自动做了很多配置