Java面试题-mysql

本文介绍了Java面试中常见的MySQL知识点,包括事务的四大特性、隔离级别及其问题、数据库范式、乐观锁与悲观锁的应用、CAS的概念与缺点,以及MySQL的索引类型和优化查询的方法。同时,对比了InnoDB与MyISAM引擎的区别,并列举了可能导致索引失效的场景。
摘要由CSDN通过智能技术生成
  1. 事务简介,事务的特性
  2. 事务的四大特征
  3. 隔离级别,产生的问题
  4. 三级范式
  5. 乐观锁与悲观锁及应用场景
  6. 什么是CAS
  7. 优化查询的方法
  8. mysql索引分类,优缺点
  9. InnoDB与MyISAM的区别
  10. 索引失效

1. 事务简介,事务的特性

  • 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败

2. 事务的四大特征

  • 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
  • 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
  • 隔离性:多个事务之间,相互独立。
  • 一致性:事务操作前后,数据总量不变。

3. 隔离级别,产生的问题:

  1. read uncommitted:读未提交
  •   产生的问题:脏读,不可重复读,幻读
    
  •   脏读:一个事务,读取到另一个事务中没有提交的数据;
    
  •   不可重复读(虚读):在同一个事务中,两次读取到的数据不一样;
    
  •   幻读:一个事务内读取到了别的事务插入的数据,导致前后读取不一致
    
  1. read committed:读已提交(Oracle)
  •   产生的问题:不可重复读,幻读
    
  1. repeatable read:可重复读(MySQL默认)
  •   产生的问题:幻读
    
  1. serializable:串行化

4. 三级范式:

  • 1nf:每一列都是不可再分的原子列
  • 2nf:满足1nf,并且非主属性完全依赖于主属性
  • 3nf:满足2nf,并且任何非主属性不依赖其他非主属性

5. 乐观锁与悲观锁及应用场景

乐观锁:认为对于同一个数据的并发操作是不会发生修改的,在更新数据时会采用尝试更新不断重试的方式更新数据
悲观锁:认为对于同一个数据的并发操作,一定是为发生修改的

6. 什么是CAS,缺点

  • CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做
  • 缺点:ABA问题,循环时间长开销大和只能保证一个共享变量的原子操作
    1. ABA问题。因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一
    2. 只能保证一个共享变量的原子操作。当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。

7. 优化查询的方法:

  • 库表优化,表设计合理化,符合三大范式;
  • 使用索引:尽量避免全表扫描,在orderby,groupby,where涉及的列上使用索引
  • 优化sql语句:通过explain查看sql语句的执行效果;不要使用select *;不在索引列做运算或使用函数;尽可能用limit减少返回的行数

8. mysql索引分类,优缺点

  • mysql会给主键和唯一约束的字段自动加索引
  • 什么时候需要添加索引:数据量庞大、字段经常被用作查询条件、该字段有很少的DML(因为DML之后,索引要重新排序)
  • 分类:普通索引,唯一索引,主键索引,空间索引,全文索引
  • 优缺点 : 加快检索速度,但需要占用物理内存,对表中数据进行改动,也需要动态维护

9. InnoDB与MyISAM的区别?

指定查询引擎:建表时使用Engine指定查询引擎,charset指定字符集;
区别

  • 事务:MyISAM不支持事务,InnoDB支持事务
  • 锁级别:MyISAM只支持表级锁,InnoDB支持行级锁和表级锁,默认使用行级锁,但是行锁只有通过索引查询数据才会使用,否则将使用表锁。行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源。使用行锁可能会存在死锁的情况,但是表级锁不存在死锁
  • 主键和外键:MyISAM 允许没有任何索引和主键的表存在,不支持外键。InnoDB的主键不能为空且支持主键自增长,如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键,支持外键完整性约束

10. 索引失效的几种情况

  1. 模糊查询的时候以"%“开头会导致索引失效,优化:模糊查询避免以”%"开头;
  2. 使用"or"的时候必须要求使用"or"的字段全都有索引,否则索引会失效,优化:用union代替;
  3. 使用复合索引的时候没有用左侧的列查找,索引失效;
  4. 查询条件中索引列参与了运算,索引失效;
  5. 查询条件中索引列使用了函数,索引失效;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的优化可以从多个方面入手。首先,可以通过优化查询来提高MySQL的性能。这包括使用合适的索引、避免全表扫描、优化查询语句等。其次,可以通过调整MySQL的配置参数来提升性能,例如增加缓冲区大小、调整并发连接数等。此外,还可以考虑使用缓存技术,如使用Redis作为缓存层,减少对数据库的访问。另外,对于大数据量的表,可以考虑分库分表的方式来提高查询效率。总之,MySQL的优化是一个综合性的工作,需要根据具体的场景和需求进行调整和优化。 参考资料: \[1\] 【Java面试总结】MySQL篇·SQL优化篇 \[2\] MySQL 精选 60 道面试题(含答案) \[3\] MySQL如何保证ACID #### 引用[.reference_title] - *1* [【Java面试总结】MySQL篇·优化篇](https://blog.csdn.net/Gherbirthday0916/article/details/129097938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Java面试题mysql面试题](https://blog.csdn.net/qq_40036754/article/details/126608721)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值