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

MySQL面试题合集!

1. 什么是索引

  • 一种能帮助mysql提高查询效率的数据结构:索引数据结构
  • 索引优点:
    • 大大提高数据查询速度
  • 索引缺点:
    • 维护索引需要耗费数据库资源
    • 索引要占用磁盘空间
    • 当对表的数据进行增删改的时候,因为要维护索引,所以速度收到影响
  • 结合索引的优缺点,得出结论:数据库表并不是索引加的越多越好,而是仅为那些常用的搜索字段建立索引效果才是最佳的!

2. 索引的分类

3. 索引的基本操作

3.1 主键索引创建
-- 建表语句:建表时,设置主键,自动创建主键索引 CREATE TABLE t_user ( id VARCHAR(20) PRIMARY KEY, name VARCHAR(20) ); -- 查看索引 SHOW INDEX FROM t_user;

AI写代码sql

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

3.2 单列索引创建(普通索引/单值索引)
-- 建表时创建单列索引: -- 这种方式创建单列索引,其名称默认为字段名称:name CREATE TABLE t_user ( id VARCHAR(20) PRIMARY KEY, name VARCHAR(20), KEY(name) ); -- 建表后创建单列索引: -- 索引名称为:name_index 格式---> 字段名称_index CREATE INDEX name_index ON t_user(name) -- 删除单列索引 DROPINDEX 索引名称 ON 表名

AI写代码sql

3.3 唯一索引创建
-- 建表时创建唯一索引: CREATE TABLE t_user2 ( id VARCHAR(20) PRIMARY KEY, name VARCHAR(20), UNIQUE(name) ); -- 建表后创建唯一索引: CREATE UNIQUE INDEX name_index ON t_user2(name);

AI写代码sql

3.4 复合索引创建
-- 建表时创建复合索引: CREATE TABLE t_user3 ( id VARCHAR(20) PRIMARY KEY, name VARCHAR(20), age INT, KEY(name,age) ); -- 建表后创建复合索引: CREATE INDEX name_age_index ON t_user3(name,age); -- 复合索引查询的2个原则 -- 1.最左前缀原则 -- eg: 创建复合索引时,字段的顺序为 name,age,birthday -- 在查询时能利用上索引的查询条件为: SELECT * FROM t_user3 WHERE name = ? SELECT * FROM t_user3 WHERE name = ? AND age = ? SELECT * FROM t_user3 WHERE name = ? AND birthday = ? SELECT * FROM t_user3 WHERE name = ? AND age = ? AND birthday = ? -- 而其他顺序则不满足最左前缀原则: ... WHERE name = ? AND birthday = ? AND age = ? -- 不满足最左前缀原则 ... WHERE name = ? AND birthday = ? -- 不满足最左前缀原则 ... WHERE birthday = ? AND age = ? AND name = ? -- 不满足最左前缀原则 ... WHERE age = ? AND birthday = ? -- 不满足最左前缀原则 -- 2.MySQL 引擎在执行查询时,为了更好地利用索引,在查询过程中会动态调整查询字段的顺序! -- 这时候再来看上面不满足最左前缀原则的四种情况: -- 不满足最左前缀原则,但经过动态调整顺序后,变为:name age birthday 可以利用复合索引! ... WHERE name = ? AND birthday = ? AND age = ? -- 不满足最左前缀原则,也不能动态调整(因为缺少age字段),不可以利用复合索引! ... WHERE name = ? AND birthday = ? -- 不满足最左前缀原则,但经过动态调整顺序后,变为:name age birthday 可以利用复合索引! ... WHERE birthday = ? AND age = ? AND name = ? -- 不满足最左前缀原则,也不能动态调整(因为缺少name字段),不可以利用复合索引! ... WHERE age = ? AND birthday = ?

AI写代码sql

4. MySQL索引的数据结构(B+Tree)

-- 建表: CREATE TABLE t_emp( id INT PRIMARY KEY, name VARCHAR(20), age INT ); -- 插入数据:插入时,主键无序 INSERT INTO t_emp VALUES(5,'d',22); INSERT INTO t_emp VALUES(6,'d',22); INSERT INTO t_emp VALUES(7,'3',21); INSERT INTO t_emp VALUES(1,'a',23); INSERT INTO t_emp VALUES(2,'b',26); INSERT INTO t_emp VALUES(3,'c',27); INSERT INTO t_emp VALUES(4,'a',32); INSERT INTO t_emp VALUES(8,'f',53); INSERT INTO t_emp VALUES(9,'b',13); -- 查询:自动排序,有序展示(因为主键是有主键索引的,因此会自动排序)

AI写代码sql

问题:为什么数据插入时,未按照主键顺序,而查询时却是有序的呢

问题:为什么要排序呢?

4.1 原理分析图

三层结构实例如图:

4.2 B+树结构分析

上图4.1 原理分析图中这种索引结构称之为B+树数据结构,那么什么是B+树呢?B树和B+树区别是什么呢?

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

问题4.2.1 为什么InnoDB底层使用B+树做索引而不用B树?

B树结构图:

5. 聚簇索引和非聚簇索引

5.1 聚簇索引和非聚簇索引分析

在表中,聚簇索引实际上就是指的是主键索引!如果表中没有主键的话,则MySQL会根据该表生成一个RoleID,拿这个RoleId当做聚簇索引!

注意:在InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,例如:复合索引、单列索引、唯一索引。一个表中只能有1个聚簇索引,而其他索引都是辅助索引!辅助索引的叶子节点存储的不再是行的物理位置,而是主键的值,辅助索引访问数据总是需要二次查找的

**问题5.1.1 **:为什么非聚簇索引(name字段的单列索引)构成的树,其叶子节点存储聚簇索引(主键id),而不直接存储行数据的物理地址呢?

换个方式问:非聚簇索引检索数据时,检索一次本树再去聚簇索引树中检索一次,这样二次检索树结构,那么为什么不直接在非聚簇索引树叶子节点中存放行数据物理地址,这样只需要检索一次树结构就拿到行数据呢?

这里画个图方便理解一些:

​ 从上图得出,在做新增数据时,因为底层是需要基于主键索引进行排序的,那么就可能导致原来某些数据对应的物理地址发生了变化,而这时候由于我们的非聚簇索引树的叶子节点直接存储了数据的物理地址,所以为了保证能获取到数据,还需要同时对非聚簇索引树叶子节点的地址进行一遍更新修改!

​ 同理,如果我们不做插入主键id为4这行记录的操作,而是将其删除的话,这个流程可以自己思考一下!

​ 也就是说:之所以不在非聚簇索引树的叶子节点直接存放行数据的物理地址,是因为,存储数据的物理地址会随着数据库表的CRUD操作而不断变更,为了保证能获取到数据,这时必须要对非聚簇索引树相关叶子节点的地址进行一遍修改!而存主键,主键不会随着CRUD操作发生变化,宁愿多查一次树,也不要再修改一次树的结构!

5.2 MySQL两种引擎中的(非)聚簇索引

InnoDB中:

MYISAM中:

5.3 聚簇索引和非聚簇索引的优/劣势

问题:5.3.1 使用聚簇索引的优势

问题:每次使用辅助索引检索都需要经过2次B+树查找,看上去聚簇索引的效率明显要低于非聚簇索引,那么聚簇索引的优势何在呢?

-- 1.由于行数据和聚簇索引树的叶子节点存储在一起,同一页中会有多条行数据,首次访问数据页中某条行记录时,会把该数据页数据加载到Buffer(缓存器)中,当再次访问该数据页中其他记录时,不必访问磁盘而直接在内存中完成访问。 -- 注:主键id和行数据一起被载入内存,找到对应的叶子节点就可以将行数据返回了,如果按照主键id来组织数据,获取数据效率更快! -- 2.辅助索引的叶子节点,存储主键的值,而不是行数据的存放地址。这样做的好处是,因为叶子节点存放的是主键值,其占据的存储空间小于存放行数据物理地址的储存空间

AI写代码sql

问题:5.3.2 使用聚簇索引需要注意什么?

-- 当使用主键为聚簇索引时,而不要使用UUID方式,因为UUID的值太过离散,不适合排序,导致索引树调整复杂度增加,消耗更多时间和资源。 -- 建议主键最好使用INT/BIGINT类型,且为自增,这样便于排序且默认会在索引树的末尾增加主键值,对索引树的结构影响最小(下面主键自增的问题会解释原因)。而且主键占用的存储空间越大,辅助索引中保存的主键值也会跟着增大,占用空间且影响IO操作读取数据!

AI写代码sql

问题:5.3.3 为什么主键通常建议使用自增id?

-- 聚簇索引树存放数据的物理地址(xx1,xx2,xx3,xxx5)与索引顺序(1,2,3,5)是一致的,即: -- 1.只要索引是相邻的,那么在磁盘上索引对应的行数据存放地址也是相邻的。 -- 2.如果主键是自增,那么当插入新数据时,只需要按照顺序在磁盘上开辟新物理地址存储新增行数据即可。 -- 3.而如果不是主键自增,那么当新插入数据后,会对索引进行重新排序(重新调整B+树结构),磁盘上的物理存储地址也需要重新分配要存储的行数据!

AI写代码sql

问题:5.3.4 什么情况下无法利用索引呢?

-- 1. 查询语句中使用LIKE关键字:(这种情况主要是针对于单列索引) -- 在使用LIKE关键字查询时,如果匹配字符串的第一个字符为'%',则索引不会被使用,而'%'不在最左边,而是在右边,则索引会被使用到! -- eg: SELECT * FROM t_user WHERE name LIKE 'xx%' -- 可以利用上索引,这种情况下可以拿xx到索引树上去匹配 SELECT * FROM t_user WHERE name LIKE '%xx%' -- 不可以利用上索引 SELECT * FROM t_user WHERE name LIKE '%xx' -- 不可以利用上索引 -- 2. 查询语句中使用多列索引:(这种情况主要是针对于聚合索引) -- 多索引是在表的多个字段创建索引,只有查询条件中使用了这些字段中的第一个字段,索引才会被使用。即:最左前缀原则,详情查看3.4小结聚合索引中的介绍! -- 3. 查询语句中使用OR关键字: -- 查询条件中有OR关键字时,如果OR前后的两个条件列都具有索引,则查询中索引将被使用,而如果OR前后有一个或2个列不具有索引,那么查询中索引将不被使用到!

AI写代码sql

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

6. 什么是约束以及分类

约束:

7. MySQL索引和约束的区别

MySQL索引相关面试题

1.MySQL索引分类,并对比区别?

答案参考:第2小结

2.复合索引查询时,字段排列的先后顺序与创建索引时不同,能否成功利用索引查询?

考察点:复合索引的最左前缀原则

-- 假设构成复合索引的字段为 name,age,birthday -- 则下面那种情况可以使用成功利用复合索引查询? ... WHERE name = ? -- 可以利用 ... WHERE name = ? AND age = ? -- 可以利用 ... WHERE name = ? AND birthday = ? -- 可以利用 ... WHERE name = ? AND age = ? AND birthday = ? -- 可以利用 ... WHERE name = ? AND birthday = ? AND age = ? -- 不满足最左前缀原则,但经过动态调整后可以利用 ... WHERE birthday = ? AND age = ? AND name = ? -- 不满足最左前缀原则,但经过动态调整后可以利用 ... WHERE age = ? AND birthday = ? -- 不满足最左前缀原则,不能动态调整,不能利用复合索引

AI写代码sql

3.MySQL索引的数据结构是什么?

MySQL索引数据结构: B + Tree

B+树,聚簇索引~

4.MySQL中索引和约束的区别以及各自种类?

MySQL索引与约束

5.为什么InnoDB底层使用B+树做索引而不用B树?

答案参考: 4.2小结B+树结构分析中的问题4.2.1

6.什么是聚簇索引和非聚簇索引

答案参考:5.1小结聚簇索引和非聚簇索引分析

7.为什么非聚簇索引构成的树的叶子节点存储聚簇索引(或主键),而不直接存储数据的物理地址呢?

答案参考:5.1小结的问题5.1.1

8.使用聚簇索引需要注意什么?

答案参考:5.3小结的问题5.3.2

9.为什么主键通常建议使用自增id?

答案参考:5.3小结的问题5.3.3

10.什么情况下无法利用索引呢?

答案参考:5.3小结的问题5.3.4

11.聚簇索引相对于非聚簇索引的优势是什么?

答案参考:5.3小结的问题5.3.1

http://www.jsqmd.com/news/123637/

相关文章:

  • ELK 保姆级部署教学
  • 脑机接口辅助新纪元(Open-AutoGLM实战指南)
  • 2025全品类仿古砖制造厂TOP5权威推荐:甄选优质厂商助力空间美学升级 - myqiye
  • 2025浙江职业技能大赛复赛(一小部分
  • 2025总有机碳分析仪采购推荐:从国产品牌实力到厂家口碑的全维度盘点 - 品牌推荐大师1
  • 2025年豆包优化服务商精选推荐:优质geo优化伙伴赋能增长 - 品牌推荐排行榜
  • 【Java毕设源码分享】基于springboot+vue的的文学名著分享系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • Interactive Brokers全新改版IBKR GlobalTrader应用,移动交易体验更简洁、更智能
  • 水蛭素哪个牌子好?水蛭素改善血黏稠度,2025十大水蛭素品牌横评 - 博客万
  • 2025年进口曲轴泵厂商权威推荐榜单:高压清洗机配件/进口高压水泵/进口高压清洗车源头厂家精选 - 品牌推荐官
  • 2025百度AI优化排名服务商推荐:聚焦geo优化的实力之选 - 品牌推荐排行榜
  • MySQL相关面试题总结
  • 收藏!大模型学习全攻略:从0起步到实战落地,小白/程序员专属
  • 废气废水监测公司为什么必须做 GEO 优化?AI 搜索时代的营销新方式 - 优质品牌推荐TOP榜
  • 2025年靠谱工业热能设备企业排行榜,岳阳远大热能实力怎么样? - mypinpai
  • Open-AutoGLM极地适配技术白皮书(仅限内部流出的3大核心算法改进)
  • 【每日算法】LeetCode 169. 多数元素:从暴力枚举到巧妙投票
  • 【程序员必看】AI能力五阶段演进详解:L1-L5全解析,L3 Agent是当下最重要的突破点
  • 2025年南阳热门短视频制作服务公司推荐:如何做好短视频运营? - 工业推荐榜
  • 新人入职,我是怎么快速接手20台服务器的
  • Open-AutoGLM与传统医疗AI对比:性能提升90%背后的架构革新
  • 2025鲁南AI搜索优化服务商TOP5权威推荐:看哪家实力强? - myqiye
  • 为什么头部跨境平台都在悄悄接入Open-AutoGLM?真相曝光
  • 2025年有实力的专项审计专业公司推荐:靠谱的专项审计企业有哪些? - mypinpai
  • vxe-table 导入 excel xlsx 时,单元格内容值丢失前面0解决方法
  • 前端错误监控与排查体系实战指南
  • 4.结构型模式
  • 如何搜索学术论文:实用技巧与高效方法指南
  • 【稀缺技术首发】:Open-AutoGLM多模态灾情感知架构深度解读
  • 从报关到结算:如何用Open-AutoGLM压缩跨境流程70%耗时?