当前位置: 首页 > news >正文

Java面试题———MySql篇②

目录

1.事务隔离级别

2.数据库三大范式

3.索引的分类

4.索引的创建原则

5.索引失效的情况

6.如何知道索引是否失效

7.MyISAM和InnoDB的区别


1.事务隔离级别

事务隔离级别是用来解决并发事务问题的方案,不同的隔离级别可以解决的事务问题不一样

  • 读未提交: 允许读取尚未提交的数据,可能会导致脏读、幻读或不可重复读

  • 读已提交: 允许读取并发事务已提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

  • 可重复读: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

  • 可串行化: 所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,该级别可以防止脏读、不可重复读以及幻读。

上面的这些事务隔离级别效率依次降低,安全性依次升高,如果不单独设置,MySQL默认的隔离级别是可重复读

2.数据库三大范式

三大范式是指导设计数据库的原则

  • 第一范式:表中的每一列不能再进行拆分,也就是每一列都应该是原子的

  • 第二范式:一张表只做一件事,不要将多个层次的数据列保存到一张表中

  • 第三范式:数据不能存在传递关系,也就是说可以通过其它字段推出来的字段没必要再存储

在现有的程序设计中认为第三范式是可以不遵守的,也就是通过添加冗余字段,来减少多表联查或计算,我们称为反三范式

3.索引的分类

索引是数据库中用于提供查询效率的一种手段

  • 从物理存储角度上分为聚集索引和非聚集索引

    聚集索引指的是数据和索引存储在同一个文件中,InnoDB存储引擎使用的是此类索引存储方式

    非聚集索引指的是数据和索引存储在不同的文件中,MyISAM存储引擎使用的是此类索引存储方式

  • 从逻辑角度上分为普通、唯一、主键和联合索引,它们都可以用来提高查询效率,区别点在于

    唯一索引可以限制某列数据不出现重复,主键索引能够限制字段唯一、非空

    联合索引指的是对多个字段建立一个索引,一般是当经常使用某几个字段查询时才会使用,它比对这几个列单独建立索引效率要高

4.索引的创建原则

索引可以大幅度提高查询的效率,但不是所有的字段都要加,也不是加的越多越好,因为索引会占据磁盘空间,也会影响增删改的效率

我们在建立索引的时候应该遵循下面这些原则:

  1. 主键字段、外键字段应该添加索引

  2. 经常作为查询条件、排序条件或分组条件的字段需要建立索引

  3. 经常使用聚合函数进行统计的列可以建立索引

  4. 经常使用多个条件查询时建议使用组合索引代替多个单列索引

除此之外,下面这些情况,不应该建立索引

  1. 数据量小的表不建议添加索引

  2. 数据类型的字段是TEXT、BLOB、BIT等数据类型的字段不建议建索引

  3. 不要在区分度低的字段建立索引,比如性别字段、年龄字段等

5.索引失效的情况

索引失效指的是虽然在查询的列上添加了索引,但是某些情况下,查询的时候依旧没有用到索引,常见的情况有

  1. 使用like关键字时,模糊匹配使用%开头将导致索引失效

  2. 使用连接条件时,如果条件中存在没有索引的列会导致索引失效

  3. 在索引列上进行计算、函数运算、类型转换将导致索引失效

  4. 使用 !=、not in、is null、is not null时会导致索引失效

  5. 使用联合索引时,没有遵循最左匹配原则会导致索引失效

6.如何知道索引是否失效

MySQL中自带了一个关键字叫explain,它可以加在一个sql的前面来查看这条sql的执行计划

在执行计划中,我们主要观察两列的结果,一列是type,一列是extra

第一个type是重要的列,显示本次查询使用了何种类型,常见的值从坏到好依次为:all、index、range、ref、eq_ref 、const、system

  • all表示全表扫描数据文件返回符合要求的记录

  • index表示全表扫描索引文件返回符合要求的记录

  • range表示检索指定范围的行,常见于使用>,<,between,in,like等运算符的查询中

  • ref表示两表查询时,驱动表可能返回多行数据,也就是查询条件在主表中是加了一个普通索引

  • eq_ref表示两表查询时,驱动表只返回一行数据,也就是查询条件在主表中是唯一的

  • const表示索引一次就能得到结果,一般是使用唯一索引或者主键作为查询条件

  • system表示表中仅有一行数据,很少见到

我们在优化的时候尽量优化到range级别以上

除了type之外我们需要关注一下extra列,它表示执行状态说明

  • 要保证此列不要出现using filesort、using temporary等使用临时表或外部文件的情况

  • 如果出现using index最好了,它表示列数据仅仅使用了索引中的信息而没有回表查询

7.MyISAM和InnoDB的区别

MyISAM和InnoDB是目前MySQL中最为流行的两种存储引擎,它们的区别有这几方面:

  1. MyISAM不支持事务,每次操作都是原子的;InnoDB支持事务,支持事务的四种隔离级别

  2. MyISAM不支持外键,InnoDB支持外键

  3. MyISAM仅仅支持表级锁,即每次操作是对整个表加锁;InnoDB支持行级锁,因此可以支持写并发

  4. MyISAM属于非聚集性索引,它的数据和索引不在同一个文件中;InnoDB属于聚集性索引,它的数据和索引在同一个文件中

  5. MyISAM中主键和非主键索引的数据部分都是存储的文件的指针;InnoDB主键索引的数据部分存储的是表记录,非主键索引的数据部分存储的是主键值

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++ 面试 - 面向对象】每日 3 题(七)
  • Linux驱动学习之点灯(六,利用平台设备总线)
  • Element-UI Table实现列表筛选数据及列表嵌套选择框
  • 从行为面试问题(behavioral questions)看中美程序员差异。
  • <数据集>流水线纸箱识别数据集<目标检测>
  • AIoTedge边缘物联网平台发布,更低的价格,更强大的功能
  • 提升学术论文质量的智能助手:ChatGPT
  • Vue3-nextTick源码阅读记录
  • CSS的:first-of-type伪类:精确定位特定类型的首子元素
  • 结合ChatGPT与Discord,提高团队合作效率
  • 软件开发者的首选:最佳Bug测试工具Top 10
  • LLM和VLM算法常见面试题
  • 编程学习之路:如何克服挫折感,成为更好的自己
  • JavaScript中设置器和获取器
  • 可集成多模型的机器人开发框架 dora:让机器人编程走向大众
  • [NodeJS] 关于Buffer
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • canvas 五子棋游戏
  • node入门
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • spring + angular 实现导出excel
  • Spring-boot 启动时碰到的错误
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于for循环的简单归纳
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 排序(1):冒泡排序
  • 通信类
  • 延迟脚本的方式
  • 再次简单明了总结flex布局,一看就懂...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • ###C语言程序设计-----C语言学习(3)#
  • #window11设置系统变量#
  • (day6) 319. 灯泡开关
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (七)glDrawArry绘制
  • (三) diretfbrc详解
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)基于IDEA的JAVA基础1
  • .gitignore文件---让git自动忽略指定文件
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • ??myeclipse+tomcat
  • @vue/cli脚手架
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [Algorithm][动态规划][01背包问题][目标和][最后一块石头的重量Ⅱ]详细讲解
  • [Android Studio 权威教程]断点调试和高级调试
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件