MySQL基础高频面试题

2023-11-17

1:什么是索引?

索引是一种用于快速查询和检索数据的数据结构。mysql中的索引结构有: B+树和Hash

索引的作用就相当于目录的作用。我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。这样查找就会非常快。

2:索引的优缺点?

优点:
1:可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。毕竟大部分系统的读请求总是大于写请求的.
2: 通过索引列对数据进行排序,降低数据排序的成本,减少cpu的消耗

缺点:
1:创建索引和维护索引需要耗费额外的时间, 所以更新表的时候会慢一点
2:占用物理存储空间 。

3.索引的分类

  • 功能分类 :
    • 普通索引: 最基本的索引,它没有任何限制。
    • 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值组合必须唯一。
    • 主键索引:一种特殊的唯一索引,不允许有空值。一般在建表时同时创建主键索引。
    • 组合索引:顾名思义,就是将单列索引进行组合。
    • 外键索引:只有InnoDB引擎支持外键索引,用来保证数据的一致性、完整性和实现级联操作。
    • 全文索引:快速匹配全部文档的方式。InnoDB引擎5.6版本后才支持全文索引。MEMORY引擎不支持。
  • 结构分类:
    • B+Tree索引 :MySQL使用最频繁的一个索引数据结构,是InnoDB和MyISAM存储引擎默认的索引类型。
    • Hash索引 : MySQL中Memory存储引擎默认支持的索引类型。

4.索引失效的几种情况

失效的几种情况
  1. 如果查询条件中有or,即使其中有些条件创建了索引,索引也不起作用,除非你对or中每个查询列都创建了索引。(mysql中测试也是无效的)
  2. 模糊查询like,查询以’%xxx’开头的不使用索引,以’xxx%'结尾会使用索引
  3. 使用了比较运算符<>或!= 不等于的运算符,不使用索引
  4. mysql如果发现不使用索引更快,则不使用索引。

5.为什么索引会提高查找速度?

这首先要从mysql的存储说起: mysql的存储形式是页, 在没有使用索引时,定位到记录所在的页:需要遍历双向链表,找到所在的页
从所在的页内中查找相应的记录:由于不是根据主键查询,只能遍历所在页的单链表了,这种查找时间复杂度为O(n)
当添加索引后: 就是将无序的数据变成有序(相对),通过 “目录” 就可以很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))

6.使用索引的注意事项

  1. 经常需要搜索的列上,可以加快搜索的速度;

  2. 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度;

  3. 在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

  4. 避免 where 子句中对宇段施加函数,这会造成无法命中索引;

  5. 在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;

  6. 在使用InnoDB时使用与业务无关的自增主键作为主键,即使用逻辑主键,而不要使用业务主键;

  7. 对于中到大型表索引都是非常有效的,但是特大型表的话维护开销会很大,不适合建索引;

  8. 删除长期未使用的索引。


sql优化

1、在表中建立索引,优先考虑where、group by使用到的字段。

*2、尽量避免使用select ,返回无用的字段会降低查询效率。
如下:
SELECT * FROM t

优化方式:使用具体的字段代替*,只返回使用到的字段。

**3、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。**如下:

SELECT * FROM t WHERE id IN (2,3)

SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)

优化方式:如果是连续数值,可以用between代替。如下:

SELECT * FROM t WHERE id BETWEEN 2 AND 3

如果是子查询,可以用exists代替。如下:

SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)

**4、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描。**如下:

SELECT * FROM t WHERE id = 1 OR id = 3

优化方式:可以用union代替or。如下:

SELECT * FROM t WHERE id = 1

UNION

SELECT * FROM t WHERE id = 3

(PS:如果or两边的字段是同一个,如例子中这样。貌似两种方式效率差不多,即使union扫描的是索引,or扫描的是全表)

**5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。**如下:

SELECT * FROM t WHERE username LIKE ‘%li%’

优化方式:尽量在字段后面使用模糊查询。如下:

SELECT * FROM t WHERE username LIKE ‘li%’

6、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE score IS NULL

优化方式:可以给字段添加默认值0,对0值进行判断。如下:

SELECT * FROM t WHERE score = 0

7、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t2 WHERE score/10 = 9

SELECT * FROM t2 WHERE SUBSTR(username,1,2) = ‘li’

优化方式:可以将表达式、函数操作移动到等号右侧。如下:

SELECT * FROM t2 WHERE score = 10*9

SELECT * FROM t2 WHERE username LIKE ‘li%’

8、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE 1=1

优化方式:用代码拼装sql时进行判断,没where加where,有where加and。


1.四大特性(ACID)

  1. 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作⽤;

  2. 一致性(Consistency): 执行事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的;

  3. 隔离性(Isolation): 并发访问数据库时,⼀个用户的事务不被其他事务所⼲扰,各并发事务之间数据库是独立的;

  4. 持久性(Durability): ⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

2.并发事务带来的问题

脏读

某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,没有提交事务,则后一个事务所读取的数据就会是不正确的。

不可重复读

一个事务多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

幻读

在一个事务的两次查询中数据笔数不一致(在查询间隔中,被另一个事务插入了数据)。

3.四种隔离级别

READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据。

REPEATABLE-READ(可重复读): 对同⼀字段的多次读取结果都是⼀致的,除非是事务本身修改的。

SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰。


1.常用引擎的特性对比
  • 常用的存储引擎
    • MyISAM存储引擎
      • 访问快,不支持事务和外键。表结构保存在.frm文件中,表数据保存在.MYD文件中,索引保存在.MYI文件中。
    • InnoDB存储引擎(MySQL5.5版本后默认的存储引擎)
      • 支持事务 ,占用磁盘空间大 ,支持并发控制。表结构保存在.frm文件中,如果是共享表空间,数据和索引保存在 innodb_data_home_dir 和 innodb_data_file_path定义的表空间中,可以是多个文件。如果是多表空间存储,每个表的数据和索引单独保存在 .ibd 中。
    • MEMORY存储引擎
      • 内存存储 , 速度快 ,不安全 ,适合小量快速访问的数据。表结构保存在.frm中。
  • 特性对比
特性 MyISAM InnoDB MEMORY
存储限制 有(平台对文件系统大小的限制) 64TB 有(平台的内存限制)
事务安全 不支持 支持 不支持
锁机制 表锁 表锁/行锁 表锁
B+Tree索引 支持 支持 支持
哈希索引 不支持 不支持 支持
全文索引 支持 支持 不支持
集群索引 不支持 支持 不支持
数据索引 不支持 支持 支持
数据缓存 不支持 支持 N/A
索引缓存 支持 支持 N/A
数据可压缩 支持 不支持 不支持
空间使用 N/A
内存使用 中等
批量插入速度
外键 不支持 支持 不支持
2.总结:引擎的选择
  • MyISAM :由于MyISAM不支持事务、不支持外键、支持全文检索和表级锁定,读写相互阻塞,读取速度快,节约资源,所以如果应用是以查询操作插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
  • InnoDB : 是MySQL的默认存储引擎, 由于InnoDB支持事务、支持外键、行级锁定 ,支持所有辅助索引(5.5.5后不支持全文检索),高缓存,所以用于对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,读写频繁的操作,那么InnoDB存储引擎是比较合适的选择,比如BBS、计费系统、充值转账等
  • MEMORY:将所有数据保存在RAM中,在需要快速定位记录和其他类似数据环境下,可以提供更快的访问。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,其次是要确保表的数据可以恢复,数据库异常终止后表中的数据是可以恢复的。MEMORY表通常用于更新不太频繁的小表,用以快速得到访问结果。
  • 总结:针对不同的需求场景,来选择最适合的存储引擎即可!如果不确定、则使用数据库默认的存储引擎!

char和varchar区别

1、char 类型是固定长度的,Mysql 在程序处理的时候不需要计算长度,所以它的速度比 varchar 要快,但是其缺点是浪费存储空间,插入时如果长度不够会在尾部以空格填充,查询时 Mysql 程序会对尾部的空格进行处理,浪费性能,综合来说,如果业务需求中字段长度变化不大的情况下使用 char 类型来存储(例如 性别 字段,不是 0 就是 1,可以设计成 char(1) )

2、在使用 varchar 类型的时候不能因为其长度可变就都为 varchar 定义一个很大的长度,实际开发中仍然要根据业务需求来设计合适的长度,定义一个远超实际需求长度的字段可能会影响 Mysql 程序的性能,并且还有可能出现一些未知的 BUG,所以设计 varchar 类型的长度时,一定要根据业务需求去评估,选择一个合适的长度

-----待更新-----

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL基础高频面试题 的相关文章

随机推荐

  • STM32单片机IAP介绍

    1 什么是IAP 首先区分下两个概念 ISP和IAP ISP In System Programming 在系统中编程 通过芯片专用的串行编程接口对其内部的程序存储器进行擦写 IAP In Application Programming 在
  • Unity中UGUI的Text实现超链接点击的解决方案

    Unity实现超链接点击 功能简介 C 脚本 使用方法 Demo工程内截图 Demo地址 功能简介 1 同一个Text内可以实现多个不同字符区域的点击 2 适配了中文 英文 韩文 日文 阿拉伯语等 更多语种待测试 C 脚本 文件名 UITe
  • uni-app 微信小程序vendor.js 过大的处理方式和分包优化

    小程序工具提示vendor js过大 已经跳过es6向es5转换 这个转换问题本身不用理会 因为vendor js已经是es5的了 关于体积控制 参考如下 使用运行时代码压缩 HBuilderX创建的项目勾选运行 gt 运行到小程序模拟器
  • Shell脚本编写教程【二】——Shell 数组

    Shell脚本编写教程 二 Shell 数组 目录 https blog csdn net shn111 article details 131590488 参考教程 https www runoob com linux linux she
  • colmap利用已知的相机内外参数重建场景

    Colmap根据相机内外参数重建稀疏模型 COLMAP稀疏重建得图像内外参文件 colmap model converter input path output path output type TXT
  • android 蓝牙ble 133,java – Android蓝牙错误133

    我正在尝试连接到 Android上的蓝牙设备 我在onClientConnectionState处理程序中收到状态133 我并不总是得到这个错误 有时连接很好 我无法指出触发问题的原因 重新启动设备和我的repro应用程序后 我甚至立即使用
  • 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。(蓝桥杯)

    题描述 对于长度为5位的一个01串 每一位都可能是0或1 一共有32种可能 它们的前几个是 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串 输入格式 本试题没有输入 输出格式 输出32行 按
  • 基于光标读取xml stax入门

    StAX 概述 从一开始 Java API for XML Processing JAXP 就提供了两种方法来处理 XML 文档对象模型 DOM 方法是用标准的对象模型表示 XML 文档 Simple API for XML SAX 方法使
  • 基于实时迭代的数值鲁棒NMPC双模稳定预测模型(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 本文 T 秒进行 N 次模拟 使用提出的使
  • 计算机二级小蒋在教务处负责学生成绩,小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区..._考试资料网...

    小蒋是一位中学教师 在教务处负责初一年级学生的成绩管理 由于学校地处偏远地区 缺 乏必要的教学设施 只有一台配置不太高的PC可以使用 他在这台电脑中安装了Microsoft Office 决定通过Excel来管理学生成绩 以弥补学校缺少数据
  • 电子企业应该先实施ERP系统还是WMS仓储管理系统

    电子企业应该先实施ERP系统还是WMS仓储管理系统 这是一个有争议的问题 不同的企业和管理专家有不同的看法 但是 从我个人的观点来看 电子企业应该先实施ERP系统 然后再考虑WMS仓储管理系统 首先 ERP系统是企业资源规划 Enterpr
  • React Native: 添加外部字体

    iOS 1 字体文件加入到Xcode项目中 2 确认字体文件包含在目标中 点击字体文件 查看是否在右栏的 Target Membership中选择了改字体 3 检查字体是否在打包的资源中 在Build Phases中查看字体是否添加在Cop
  • c++ point类(含输入和输出的重载)

    问题描述 定义类point 其中包括两个数据成员 均为 int 类型 为点的横坐标和纵坐标 类的成员函数如下 构造函数 包括两个参数 其两个参数的默认值为0 重载运算符 两个点相应的坐标相加 比如 1 1 2 2 3 3 两个点相应的坐标相
  • 华为OD机试真题- 目录删除-2023年OD统一考试(B卷)

    题目描述 某文件系统中有N个目录 每个目录都一个独一无二的ID 每个目录只有一个父目录 但每个父目录下可以有零个或者多个子目录 目录结构呈树状结构 假设 根目录的ID为0 且根目录没有父目录 其他所有目录的ID用唯一的正整数表示 并统一编号
  • 升级需谨慎,开发两行泪!——记一次MySQL驱动包升级引发的事故

    一 背景 最近项目组在版本迭代时 组件也要进行升级 此时涉及到MySQL驱动包jdbc的版本升级 即从5 1 X升级到8 0 X 然鹅在上线之后就出现了一部分兼容性问题 造成了一次 事故 调用接口出现 系统错误 查看日志 java time
  • Idea中Springboot开启热部署方法

    Springboot1 3后支持热部署 具体方法如下 1 增加依赖
  • 【Java学习笔记】70:借助Redis实现分布式锁

    这节学习Java用Redis做分布式锁 来做秒杀场景卖货减库存的案例 最原始的减库存写法 这里库存也存Redis里面 调减库存接口的时候判断一下大于0 还有库存 就拿出来减1 这里StringRedisTemplate是Spring Boo
  • elasticsearch的映射 (mapping)

    一 概念 映射 mapping 就是指定索引 index 里面的每个文档中的字段的类型 设置字段的存储和查询的分析策略 es对不同的字段类型 有不同的存储和检索策略 比如对于text类型的字段 会经过各类分词处理 大小写转换 同义词转换 才
  • VTK5.10.1+Cmake+vs2010整合安装

    1 下载 VS2010就自己在网上找了咯 这里不提供具体路径下载了 vtk 5 10 1 zip源程序 vtkdata 5 10 1 zip 数据 vtkDocHtml 5 10 1 tar gz 文档可以不下载 vtk相关安装程序下载 h
  • MySQL基础高频面试题

    1 什么是索引 索引是一种用于快速查询和检索数据的数据结构 mysql中的索引结构有 B 树和Hash 索引的作用就相当于目录的作用 我们只需要先去目录里查找字的位置 然后直接翻到那一页就行了 这样查找就会非常快 2 索引的优缺点 优点 1