数据库相关

1-分库分表原则:
1.垂直分库:按照不同的系统进行单独的库,
库和表的结构不一样
2.水平分库:相同的业务,根据不同的业务类型单独分库,
库和表的结构一样,只是数据不一样
3.垂直分表:同一个库中,根据字段的活跃度,
把同一个表中拆成(主表和从表),数据有关联关系
4.水平分表:同一个库中,根据业务不同,分多个表,
表结构一样,数据不一样
5.分库分表工具:sharding-jdbc/mycat分库分表
6.在业务过程中,对外用分库分表,提高操作效率,但是对内,因为时效性没那么高,为了数据查询范围更大,可以把所有数据同步存入ES提供内部查询
MySQL与ES数据同步,只能做到insert和update同步:logstash-jdbc-input;安装logstash与ES保持一致。
https://www.cnblogs.com/xuwenjin/p/8987546.html

2-MVCC原理:
https://zhuanlan.zhihu.com/p/421769708
https://www.cnblogs.com/zakun/p/php-transaction.html
1.数据库的隔离级别-读已提交,可重复读,是基于MVCC实现的,可重复读是在事务开始时创建1次read view,读已提交是每次执行语句时就创建1次read view
2.事务版本号,readview隐含字段trx_id,roll_pointer
3.undo log的回滚日志中,例如delete一条记录时,log中会增加一条insert语句
4.innodb中,每个Sql执行前都会得到一个read view,用来做可见性判断
5.MVCC是基于read view+undo log来实现的,undolog保存历史快照,Read view判断当前版本可见性

MVCC解决:
1-读写并发的时,提高读写并发的问题;
2-实现读一致性的问题,解决脏读/幻读/不可重复读问题,
3-但是不能解决写数据丢失问题,采用乐观锁和悲观锁写入写的冲突

3-索引-索引失效:
https://zhuanlan.zhihu.com/p/166247445
1.联合索引,最左原则
2.索引值不能为null;可以用default值
3.字符串条件的值没有用‘’
4.or条件没有使用索引
5.%用在模糊查询的左边
6.索引字段参与计算
7.隐式转换:关联表的两个字段类型不一致会发生隐式转换

4-聚集索引与非聚集索引:
https://www.cnblogs.com/sunlong88/p/13031344.html
无论是聚集索引,还是非聚集索引,都可以是唯一索引
1.1个表只能有一个聚集索引,一般是主键索引,若没有定义主键,则会选择第一个非空的唯一索引;若没有非空唯一索引,则拿rowid来作为聚集索引
2.表中的数据是按照聚集索引排序存储的,位置相邻,非聚集索引的数据存储,位置不相邻;
3.聚集索引检索的是每行数据的真是内容,非聚集索引先检索的是每行数据的主键,然后在用聚集索引检索所有数据,这个就是回表的概念

5-B-tree,B+tree(mysql innodb就是用B+树)
B树:1.所有节点都有指针和数据,2.不同的叶子节点之间没有连在一起,3.可能在非叶子节点中拿到数据
B+树:1.只有叶子节点有数据;2.所有叶子节点通过指针链接在一起;3.只能在叶子节点获取数据,搜索稳定
4.B+树非叶子节点不存数据,可以存更多的索引,同时降低了树的高度,提高搜索速度
5.B+树叶子节点连接在一起,若是范围查询比B树在非叶子节点和叶子节点间来回移动更容易

6-回表:
1.主键索引和非主键索引,数据结构都是B+树,区别是:主键索引,叶子节点存储的是一行完整数据;非主键索引,叶子节点存的是主键值
2.回表表就是在用非主键查询时,需要扫描两课B+树,一次查询拿到主键,再通过主键再去搜索1次B+树

防止回表:
1.索引覆盖
是一种避免回表查询的优化策略-注意:非主键查询时,若查询结果列在索引中,那么即使是非主键索引查询,也不会回表
2.当where条件包含主键索引/聚集索引就不会回表,直接可以找到对应的数据

7-核心概念:
1.数据库隔离级别:读未提交,不可重复读(RC),可重复读(RR);串行化;默认设置:可重复读
2.脏读,不可重复读,幻读
3.ACID-原子性/一致性/隔离性/持久性
4.脏读:是某一事务读取了另一个事务未提交的脏数据
不可重复读:读取了前一事务提交的数据
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)
–JDBC操作时设置当前事务隔离级别
5.在sql的前面加上explain关键字,查看Sql查询过程情况
6.mysql连接池:c3p0;Druid;dbcp;hikari prometheus grafana 数据库连接池监控组合
设置最大最小连接池个数,最小连接池数是保持始终活跃,最大连接池是防止并发量太大,超过最大就等待,太大了容易导致TPS下降,根据数据库服务器的情况来设置连接池最大数= (核心数 * 2) + 有效磁盘数
7.mysql锁:共享锁;排他锁;行锁;表锁;意向锁
8.explain+sql:查看Sql的执行计划
https://blog.csdn.net/fsdfkjai/article/details/121770629
主要列:
type列-决定如何查找表中的行,依次从最优到最差分别为:system > const > eq_ref > ref > range > index > all
key列-显示MySQL在查询时实际用到的索引
rows列-估计要读取的行数,不是最终结果集的行数
Extra列-额外信息

8-mysql的执行过程
https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/121781671
1.server层:连接器-通信,验证账户,权限;分析器-解析Sql的正确性;优化器-优化索引,选择最优方案;执行器-API调用执行那个引擎(建表时创建,一般是innodb或mysiam)
2.引擎层:
1.写undolog,对应回滚记录-select操作时不需要此步
2.将记录所在目标页存在内存中
3.写redolog 保证数据的持久化到磁盘
4.写binlog,用于主从备份
5.提交事务-刷新redolog持久化;刷新undolog

9-innodb与mysiam的区别:
https://blog.csdn.net/weixin_41832850/article/details/106063426
1.innodb支持事务,支持外键;mysiam没有
2.innodb在使用索引时支持行锁;mysiam只支持表锁
3.索引都是基于B+树;innodb叶子节点存放数据/mysiam存放指针
4.innodb是默认聚集索引;mysiam默认是非聚集索引,且索引和数据是分开的,索引里存放的是指针
5.innodb不存放表的行数;mysiam存放,所以select count(*)时更快
6.事务和外键需要时用innodb;只是查询时用mysiam

9-mysql死锁的产生,以及解决方案:
1.乐观锁,version
2.悲观锁,数据库级别的锁机制

10-select * from table for update使用行锁还是表锁?
https://www.jianshu.com/p/e473cb6bb93a
1.for update 排他锁/独占锁,用在select操作时手工对数据进行锁操作
https://blog.csdn.net/weixin_44923168/article/details/121682128
如果查询条件用了索引或主键,那么select * from table_name where 主键或索引字段 = 某值 for update 就会进行行锁,同时再执行其他如update操作,只要不是主键或索引的行,就可以执行成功。
如果是普通字段(没有索引或主键),那么select * from table_name where 非(主键或索引)字段 = 某值 for update就会进行表锁,同时再执行其他如update操作,都不会执行成功
若是select 主键字段 其他字段 from table_name where 非(主键或索引)字段 = 某值 for update 这样也会是:行锁

11-mysql优化:
https://www.cnblogs.com/jalja365/p/14783758.html
innodb_flush_log_at_trx_commit:0/1/2事务日志提交策略-即提交事务的时候将redo日志写入磁盘中的时机
sync_binlog:配置二进制binlog日志写入磁盘的时机
max_connections:最大连接数
innodb_buffer_pool_size:缓存innodb表的索引(多个索引),数据,插入数据时的缓冲。innodb重点优化的参数,默认128M,建议设置数据库服务器内存的70-80%

12-Mybatis中 #{}和 的区别 h t t p s : / / z h u a n l a n . z h i h u . c o m / p / 1388555631. {}的区别 https://zhuanlan.zhihu.com/p/138855563 1. 的区别https://zhuanlan.zhihu.com/p/1388555631.{}拼字符串,安全隐患,SQL注入
2.#{}会在预编译期,生成 ?,作为占位符

13-mybatis与JPA的区别
1.JPA没有具体的sql语句实现,通过findByXxx规则就可以自动实现数据库查询,当然也可以自己写Sql灵活实现,但是要加上:nativeQuery=ture
2.JPA对数据量大的时候,执行效率没有M强

14-mybits原理:
1.一级缓存,二级缓存
https://blog.csdn.net/lianghecai52171314/article/details/121968433
2.创建sqlsession对象;execute动态生成Sql语句;mappedStatement封装映射的Sql,hashmap存储sql的id,参数等信息;resultHandler对返回结果进行处理得到想要的数据格式或类型
3.封装JDBC操作
2.利用反射打通Java类与SQL语句之间的相互转换
mybatis缓存:
一级缓存是SqlSession级别的缓存,每个SqlSession对象都有一个哈希表用于缓存数据,
不同SqlSession对象之间缓存不共享。同一个SqlSession对象对象执行2遍相同的SQL查询,
在第一次查询执行完毕后将结果缓存起来,这样第二遍查询就不用向数据库查询了,直接返回缓存结果即可。
MyBatis默认是开启一级缓存的。
二级缓存是mapper级别的缓存,二级缓存是跨SqlSession的,多个SqlSession对象可以共享同一个二级缓存。
不同的SqlSession对象执行两次相同的SQL语句,第一次会将查询结果进行缓存,第二次查询直接返回二级缓存中的
结果即可。MyBatis默认是不开启二级缓存的,可以在配置文件中使用如下配置来开启二级缓存:



当SQL语句进行更新操作(删除/添加/更新)时,会清空对应的缓存,保证缓存中存储的都是最新的数据。
MyBatis的二级缓存对细粒度的数据级别的缓存实现不友好,比如如下需求:对商品信息进行缓存,
由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,
此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,
因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。
解决此类问题需要在业务层根据需求对数据有针对性缓存,具体业务具体实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值