MySQL高频面试题

这篇具有很好参考价值的文章主要介绍了MySQL高频面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是DDL、DML、DQL

DDL(数据定义语言),用来定义(创建删除修改)数据库对象(数据库、表、字段)

DML(数据操纵语言),用来对数据库表中的数据进行增删查改(insert、delete、select、update),DQL(数据库查询语言),用来查询数据库表中的记录

DCL(数据控制语言),用来创建数据库用户、控制数据库访问权限等,常用关键字有 GRANT、REVOKE 等

了解过索引吗(什么是索引)?

索引是帮助mysql高效获取数据的数据结构(有序)。mysql InnoDB索引的底层实现是B+树

索引的数据结构:B+树

前言:B树:是一种多路平衡查找树,相对于二叉树,b树每个节点可以有多个分支

以一颗最大度数(max-degree)为5的b树为例,该b树的每个节点最多可以存储4个key
MySQL高频面试题
b+树是b树的优化,非叶子节点只存储指针,不存储数据,叶子节点存储数据。叶子节点之间是一个双向循环链表。
MySQL高频面试题
MySQL的InnoDB引擎采用的B+树的数据结构来存储索引的优点

1、阶数更多,路径更短
2、磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
3、B+树便于扫库和区间查询,叶子节点是一个双向链表

面试问题:什么是索引

回答: 索引(index)是帮助MySQL高效获取数据的数据结构(有序)提高数据检索的效率,降低数据库的IO成本(不需要全表扫描),通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

什么是聚簇索引?什么是非聚簇索引

聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据,必须有且只有一个,物理上有序。

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。

  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。

  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置(id),可以多个,逻辑上有序,物理上无序

MySQL高频面试题
聚集索引和非聚集索引详解

回表查询
MySQL高频面试题
通过非聚集索引找到对应的主键值,然后拿着主键值到聚集索引中查找整行的数据,这个过程就是回表查询。

上述图中,select * … 通过二级索引查询不到全部的数据,需要回表查询,因此尽量避免使用select *

覆盖索引:是指查询使用了索引且需要返回的列,在该索引中全部能找到,不需要回表查询。
MySQL高频面试题

索引创建原则

  • △ 针对数据量大且查询频繁的表建立索引(单表数据超过10w)
  • △ 针对常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引 *
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,索引的效率越高
  • 若是字符串类型的字段,字段的长度较长,可以建立前缀索引
  • △ 尽量使用联合索引,减少单索引,联合索引很多时候是覆盖索引,节省内存空间,避免回表查询,提高效率。
  • △ 控制索引的数量,索引不是越多越好,索引越多,维护索引结构的代价就越大,会影响增删改的效率。
  • 若索引列不能存储null值,请在创建表时使用not null约束。当优化器知道每列是否包含null值时,它可以更好的确定哪个索引最有效地用于查询。

索引失效情场景

假设name,status,address字段是一个组合索引 idx_nsa

1、违反最左前缀法则(最左前缀法则是指查询从索引的最左列开始,不跳过索引中的列)

# 符合最左前缀法则情况
where name = 'xxx'
where name = 'xxx' and status = 1
where name = 'xxx' and address = 'xxx'
where name = 'xxx' and status = 1 and address = 'xx'
#违反最左前缀法则情况
where status = 1 and address = 'xx'

2、范围查询,右边的列索引失效

# status 范围查询,address索引失效
where name = 'xxx' and status > 1 and address = 'xx'

3、在索引列上使用运算操作或使用函数,该索引列失效

# 在name列上使用了substring ,索引失效
where substring(name,3,2) = 'xx'
# 在id列上使用操作运算符 ,索引失效
where id + 1 = 2

4、字段类型不同

# 字符串不加单/双引号,造成索引失效
where address = xx

5、以%开头的模糊查询可能会使索引失效。若是尾部模糊匹配,索引不会失效

# 可能会使索引失效
where address like '%xxx'
# 索引不会失效
where address like 'xxx%'

6、select *

# 查询使用了select * 且查询条件不是索引列
select * from table_name where sex = 1

7、列对比

select * from user where id=height

8、使用or关键字

where name = 'xxx' or status = 1

9、not in 和 not exists (聚集索引不会失效,非聚集索引会失效)

# 索引不会失效
where id not in(1,2)
# 如果是组合索引且符合最左前缀法则,索引也不会失效
where name not in('t','b')
# 索引失效
where status not in(1,2)

索引的优缺点

优点

  • 通过创建唯一索引,可以保证每一行数据的唯一性
  • △ 加快数据的检索速度
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

缺点

  • 创建索引和维护索引要耗费时间,时间随着数据量的增加而增加。
  • 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

面试题:谈谈你对sql优化的经验

表的设计优化(参考阿里开发手册《嵩山版》)

  • 根据实际情况选择合适的数值类型(tinyint;int;bigint),
  • 根据实际情况选择合适的字符串类型(char;varchar)char是定长的,效率高;varchar是可变长度的,效率稍低

sql语句优化

  • select语句必须指明字段(禁止使用select *)

  • sql语句避免索引失效的写法

  • 尽量使用union all 代替 union;(union all和union的区别:取结果的交集,union对两个结果集进行并集操作,不包括重复行,相当于distinct,同时进行默认规则的排序;union all:对两个结果集进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复。)

  • join优化 能用inner join 就不用left/right join ;若必须使用,要与小表为驱动

  • 内连接会对两个表优化,优先把小表放外边,大表放里边。left/right join 不会调整顺序。

超大数据分页问题

优化思路:一般分页查询时,通过覆盖索引能够比较好地提高性能,可以通过覆盖索引+子查询的方式进行优化。
示例:

select * from stu s,(select id from stu order by id limit 9000000,10) t where s.id = t.id 

面试题:了解mysql事务吗

mysql事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作视为一个不可分割的整体一起向系统提交或撤销操作请求,即这些操作要么同时成功;要么同时失败。
事务的特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全成功,要么全失败

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

  • 持久性(Durability):事务一旦提交或回滚,它对数据库的数据的改变时永久性的

并发事务带来哪些问题?怎么解决这些问题?mysql的默认隔离级别?

并发事务问题

脏读:一个事务读取到了另一个事务尚未提交的数据,也就是读取到了"脏数据"。如果后续未提交的事务回滚了,则读取到的数据就是无效的。脏读会导致数据不一致,因此需要避免。

不可重复读:一个事务在同一个时间点内多次读取同一行数据,但是读取到的数据不一致。这是因为在读取过程中,另一个事务修改了该行数据并提交了事务。不可重复读也会导致数据不一致,因此也需要避免。

幻读:一个事务在同一个时间点内多次执行相同的查询,但是返回的结果集不一致。这是因为在查询过程中,另一个事务插入了符合查询条件的新数据并提交了事务。幻读也会导致数据不一致,因此也需要避免。

隔离级别:读未提交、读已提交、可重复读、串行化(低到高)
这四个概念都是数据库中的事务隔离级别,用来控制事务之间的隔离性和数据一致性。

  • 读未提交(Read Uncommitted):最低的隔离级别,一个事务可以读取到另一个事务尚未提交的数据,也就是脏读。读未提交级别可以提高并发性,但是会导致数据不一致。
  • 读已提交(Read Committed):一个事务只能读取到已经提交的数据,避免了脏读的问题。但是在同一个事务中,多次读取同一行数据可能会出现不一致的情况,也就是不可重复读。
  • 可重复读(Repeatable Read):一个事务在同一个时间点内多次读取同一行数据,读取到的数据是一致的,避免了不可重复读的问题。但是在同一个事务中,多次查询可能会出现不一致的情况,也就是幻读。
  • 串行化(Serializable):最高的隔离级别,通过强制事务串行执行来避免脏读、不可重复读和幻读的问题。但是串行化会导致并发性降低,因为多个事务需要串行执行。

总结
MySQL高频面试题文章来源地址https://www.toymoban.com/news/detail-462157.html

到了这里,关于MySQL高频面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高频面试题,webpack 中hash、chunkhash、contenthash有什么区别

    在Webpack中, hash 、 chunkhash 和 contenthash 都是用于生成文件名哈希的选项,它们有以下区别: hash: 适用范围: 适用于所有文件,包括入口文件、依赖的模块文件等。 特点: 所有的输出文件共享同一个 hash 值,即使只有一个文件发生改变,所有的文件名都会发生变化。 chunkh

    2024年01月21日
    浏览(38)
  • 【大数据】什么是Flink?Flink能用来做什么?

    Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 Apache Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的

    2024年02月04日
    浏览(47)
  • 大数据高频面试题

    Hadoop基础 介绍下Hadoop Hadoop的特点 说下Hadoop生态圈组件及其作用 Hadoop主要分哪几个部分?他们有什么作用? Hadoop 1.x,2x,3.x的区别 Hadoop集群工作时启动哪些进程?它们有什么作用? 在集群计算的时候,什么是集群的主要瓶颈 搭建Hadoop集群的xml文件有哪些? Hadoop的checkpoint流程 Ha

    2024年02月08日
    浏览(34)
  • mysql 数据库定义语言(DDL)

    目录 库的操作 数据库创建 数据库编码集 数据库删除 数据库修改 数据库查询 数据库备份 表的操作 表的创建 查询表 删除表 修改表 这里先声明一下,这篇文章主要是讲数据库表的定义操作,也就是 DDL,只要是对数据库以及表结构操作的 SQL 数据库的创建,其实在之前我们浅

    2024年02月12日
    浏览(42)
  • Redis数据结构:高频面试题及解析

    Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能

    2024年02月08日
    浏览(65)
  • Mysql-------SQL:DDL数据定义语言、DDM数据操作语言、DQL数据库查询语言、DQL数据控制语言

    SQL语言可以分为: DDL(Data Definition Language)语言:数据定义语言,用于 创建或更改数据库中的表、视图、索引等对象 DML(Data Manipulation Language)语言:数据操作语言,用来对 数据库表中的数据进行增删改查操作; DQL(Data Query Language)语言: 数据查询语言,用来查询数据库

    2024年02月13日
    浏览(75)
  • 【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

    一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目 解题思路 时间 空间 两数之和 辅助哈希 使用map存储出现过的值,key为值大小,v

    2024年02月22日
    浏览(59)
  • C语言常见面试题:什么是宏,宏的作用是什么?

    宏在计算机科学中是一种批量处理程序命令,它是一种抽象的规则或模式,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。在编译时,预处理器会对宏进行展开,即将宏的内容替换到宏所在的位置。 宏的作用主要有以下

    2024年01月23日
    浏览(39)
  • 【Mysql】一篇带你了解数据定义,操作和查询语言

    目录 数据定义语言DDL(Data Definition Language) 一.对数据库的操作 二.对数据表的操作 数据操作语言DML(Data Manipulation Language) 一.添加 insert into 二.删除  delete 三.修改  update 数据查询语言DQL(Data Query Language) 一.查询 select 二. 1.between ... and ...(在....之间) 2.in, exists

    2024年02月12日
    浏览(87)
  • 【教程】MySQL数据库学习笔记(三)——数据定义语言DDL(持续更新)

    写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 DDL(Data Definition Language,数据定义语言) 是用于定义和管理数据库对象(如表、视图、索引等

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包