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

MySQL-存储引擎和索引

1.MySQL的基础架构是什么?

在这里插入图片描述

MySQL由连接器、分析器、优化器、执行器和存储引擎这五部分构成。

一条SQL的执行流程:

  1. 通过连接器连接数据库,检查用户名和密码,以及权限校验,是否有增删改查的权限。
  2. 在MySQL8.0之前,连接完数据库后会先判断缓存是否有数据,如果执行过这个SQL语句,直接返回。8.0之后没有了缓存,直接进入分析器,进行词法分析判断执行的什么操作,语法分析检查语句是否存在问题。
  3. 进入优化器,选择合适的索引以及查询的顺序,由优化器指定执行计划。
  4. 进入执行器之前先进行权限校验,权限信息是从连接器中取出来的,权限没问题就开始执行。
  5. 最后由存储引擎负责读写数据,MySQL默认的存储引擎是InnoDB,采用Buffer Pool来减少对磁盘的直接I/O,并通过redo logundo log来保证事务的持久性和原子性。

SQL语句的执行顺序是From子句返回初始结果集,WHERE子句排除不满足条件的行,GROUP BY子句进行分组,HAVING子句排除不满足条件的组,最后经过ORDER BY子句对结果集进行排序。

2.MySQL中有哪些存储引擎?

MySQL中的存储引擎是插件式的,可以为不同的数据库表设置不同的存储引擎。主要有四种存储引擎,InnoDBMyISAMMemoryArchive

  1. InnoDB是支持事务完整的ACID特性的,MyISAM、Memory和Archive都不支持事务。
  2. InnoDB和Archive采用的是行级锁,而MyISAM和Memory采用的是表级锁。
  3. InnoDB支持外键,保证数据的完整性,而其它的存储引擎都不支持外键。
  4. InnoDB通过redo logundo log来实现崩溃后的自动恢复,其他几种存储引擎不支持崩溃后的自动恢复。
  5. InnoDB的存储方式是数据与索引一体,MyISAM是数据与索引分离。Memory存储在内存,Archive进行压缩存储。
  6. InnoDB主要用于高并发的场景下,MyISAM适合静态读,Memory适合存放临时数据,Archive存放归档数据。

3.什么是MySQL索引?

创建索引的目的就是加快检索速度,但是维护索引需要耗费性能。

  1. MySQL索引默认采用的数据结构是B+树,B+树的数据全部存放在叶子节点上,这样就可以组织更宽的树,树高就会降低,减少磁盘I/O。
  2. B+树采用双向链表,非常适合范围查询和排序。

4.什么是二级索引(非聚簇索引)?

非聚簇索引就是非主键做为索引,可以有多个,叶子节点存放的是主键值

5.什么是聚簇索引?

聚簇索引就是将主键做为索引,只能有一个,叶子节点存放的是整行数据。如果表中没有主键,默认使用唯一字段做为索引,如果没有唯一字段就采用隐藏字段rowid做为索引。

6.什么是回表查询?

回表查询就是通过非聚簇索引找到主键值,再通过聚簇索引找到对应的数据。非聚簇索引不一定回表查询,比如查询用户名,用户名正好建立了索引,直接返回就可以。

7.什么是覆盖索引?

覆盖索引就是查询使用了索引,返回的字段必须在索引中全部找到。覆盖索引查询就是一次性查询,不需要回表查询。如果我们使用主键进行查询,那么就会采用聚簇索引返回所有字段的数据,这就是覆盖索引查询。

8.什么是联合索引?

联合索引就是多个字段创建的索引,相比于单列索引,每个索引对应一颗B+树,而联合索引只需要一颗B+树。最左匹配原则就是在使用联合索引时,MySQL会按照字段的顺序,从左到右依次查询字段。需要注意的是,如果查询条件中存在范围查询,从这个范围列开始就不会继续向后匹配索引了。我们在使用联合索引的时候,将区分度最高的字段放到左边,这样可以过滤更多的数据。

9.如何选择合适的字段创建索引?

  1. 选择不为NULL的字段
  2. 选择查询频繁的字段
  3. 选择做为查询条件的字段
  4. 选择频繁排队的字段

10.什么情况下索引会失效?

  1. 组合索引未遵循最左匹配原则
  2. 索引上进行计算、类型转换等操作
  3. 使用%开头的LIKE模糊查询
  4. 查询条件使用OR但是有一列没有索引

相关文章:

  • [dp11_最长子序列(不连续)] 最长数对链 | 最长定差子序列 最长的斐波那契子序列的长度
  • Nginx底层架构(非常清晰)
  • redis系列--1.redis是什么
  • qt(vs2010) 手动配置moc生成规则
  • 数据大屏只能撑撑场面?
  • Uniapp:本地存储
  • 卫星电话扬帆智慧海洋,构筑蓝海通信新生态
  • 48V/2kW储能电源纯正弦波逆变器详细设计方案-可量产
  • 【7】深入学习Buffer缓冲区-Nodejs开发入门
  • CS5346 - Annotation in Visualization (可视化中的注释)
  • 【Python爬虫】简单案例介绍3
  • 详细解读 box-sizing: border-box;
  • 大模型——Crawl4AI入门指南
  • 【高性能缓存Redis_中间件】三、redis 精通:性能优化与生产实践
  • 从零开始:前端开发者的SEO优化入门与实战
  • 如何在服务器上搭建mail服务器邮件服务器
  • obsidian写文章的图床设置方法
  • 应用分享:基于 Grounding DINO 的智能膳食助手如何推进健康信息学发展
  • Qt样式表(窗口、按钮之类,有图片和代码详细注释)
  • Windows单机模拟MySQL主从复制
  • 上海市市长龚正会见英伟达总裁黄仁勋,共创科技发展美好未来
  • 中签不易,住宿更难,马拉松赛事期间酒店涨价难题如何解决?
  • 14岁男孩膀胱内现52颗磁力珠,专家呼吁关注青春期少年心理健康
  • 新华每日电讯写在浦东开发开放35周年之际:改革开放为笔,绘就崭新传奇
  • 钧正平发声:擅自更改地图标注,谷歌想当南海搅局者?!
  • 提升青春期+亲子含量:社区商业综合体这样用好“二次元”