java面试之数据库

  • 事务
    事务是逻辑上的一组操作数,要么都执行,要么都不执行

特性:
1.原子性:最小的操作单位
2.一致性:执行事务前后,数据保持一致
3.隔离性:并发访问数据库,事务之间互不影响
4.持久性:事务被提交之后,数据库中的改变是持久的

并发事务带来的问题:
1.脏读:一个事务读取并修改了数据,还没有提交,另一个事务读取数据
2.丢失修改:一个事务对数据的修改,被另一个事务的修改覆盖
3.不可重复读:一个事务内多次读同一个数据,还未完成事务时,同一数据被另一个事务“修改”,导致数据不一致
4.幻读:一个事务内读了几行,另一个并发事务插入了几条数据。在随后的查询中发现多了几条不存在的数据

事务的隔离级别:
1.读未提交:
2.读已提交
3.可重复读
4.可串行化
安全级别一次升高
隔离级别 脏读 不可重复读 幻影读
READ-UNCOMMITTED √ √ √
READ-COMMITTED × √ √
REPEATABLE-READ × × √
SERIALIZABLE × × ×

  • InnoDB存储引擎

可重复度隔离级别,使用Next-Key Lock算法,可以避免幻读,达到课串行化隔离级别
隔离级别越小,事务请求锁越少,大部分数据库系统事务隔离级别都是读已提交,InnoDB采用课重复读并不会损失性能
InnoDB在分布式事务中一般会使用课串行化隔离级别

  • MyISAM与InnoDB对比总结
    1.count运算区别
    MyISAM有缓存表meta-data,在做COUNT时对一个结构很好的查询不需要消耗多少资源。InnoDB没有
    2.是否支持事务崩溃后的安全恢复
    MyISAM强调性能,每次查询具有原子性,执行行数度比InnoDB快,但不支持事务。
    InnoDB提供事务,外部键等高级数据库功能。具有事务(commit)回滚(rollback)和崩溃修复的事务安全型表
    3.是否支持外键
    MyISAM不支持,InnoDB支持

总结
MySAM适合读密集的表,InnoDB适合写密集的表。
在数据库做主从分离的情况下,常选用MyISAM做主库存储引擎。
如果需要事务支持,并且写并发较高,选用InnoDB。
如果不需要事务支持,数据量很大,选用MyISAM(支持压缩特性,可以减少磁盘空间)

  • 索引

使用索引:
提高数据检索速度
通过创建索引,保证数据库中每行的唯一性
将随机IO变成顺序IO

缺点:
对表进行增删改时,需要维护索引
随着数据量的增大,创建和维护索引的成本增大
占据数据和物理空间

索引如何提高检索速度
将无序的数据变成有序的数据

使用索引需要注意的事项
删除长期未使用的索引,否则造成损耗。可以通查询sys库中的chema_unused_indexes视图来查询未使用索引
避免where子句中对字段施加函数,这会造成无法命中索引

Mysql索引的主要两种数据结构
1.哈希索引
绝大多数需求为单条记录查询时使用,速度快。其余情况使用BTree索引
2.BTree索引
Mysql中的BTree索引使用的是B树中的B+Tree。但两种主要的存储引擎的实现方式不同

Mysql单标数据过大时,优化措施
1.限定数据范围:禁止不带限制数据范围的查询语句
2.读/写分离:主库负责写,从库负责读
3.垂直分区:
优点:使行数据减少,简化表结构,易于维护。
缺点:出现主键冗余,需要管理冗余列,让事务变得复杂
4.水平分区
保持数据结构不变,对数据进行分片,每片数据分到不同的表或者库中(最好分库),达到分布式的目的。可以支持非常大的数据量。
但 分片事务难以解决 ,跨界点Join性能较差,逻辑复杂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值