1.MySQL存储引擎及区别

特性MyISAMMemoryInnoDB
B+ 树索引✅ Yes✅ Yes✅ Yes
备份 / 按时间点恢复✅ Yes✅ Yes✅ Yes
集群数据库支持❌ No❌ No❌ No
聚簇索引❌ No❌ No✅ Yes
压缩数据✅ Yes❌ No✅ Yes
数据缓存❌ NoN/A✅ Yes
加密数据✅ Yes✅ Yes✅ Yes
外键支持❌ No❌ No✅ Yes
全文检索✅ Yes❌ No✅ Yes
地理空间数据类型支持✅ Yes❌ No✅ Yes
地理空间索引支持✅ Yes❌ No✅ Yes
哈希索引❌ No✅ Yes❌ No
索引缓存✅ YesN/A✅ Yes
锁的粒度TableTableRow
MVCC❌ No❌ No✅ Yes
复制支持✅ YesLimited✅ Yes
存储限制256 TBRAM64 TB
T-tree 索引❌ No❌ No❌ No
事务❌ No❌ No✅ Yes
存储引擎特点事务支持锁粒度适用场景
InnoDBMySQL 8.0 默认引擎,支持 ACID 事务,行级锁,支持外键,支持崩溃恢复行锁高并发 OLTP 系统
MyISAM不支持事务,只有表级锁,读取速度快,占用空间小,支持全文索引表锁以读为主、日志、归档类系统
Memory数据存储在内存中,速度极快,但数据易丢失(重启清空),支持哈希索引表锁临时表、缓存计算
CSV数据存储为 CSV 文件,方便与外部程序交换数据,不支持索引表锁数据导入导出

2.Mysql的InnoDB引擎中的聚簇索引和非聚簇索引有什么区别?

聚簇索引的非叶子节点存储的是索引值,叶子节点存储的是完整的数据记录,一个表只能有一个聚簇索引,一般是表的主键,主要用于范围查询和排序。非聚簇索引的非叶子节点存储的也是索引值,但是叶子节点存储的是数据行的主键和对应的索引列,一个表可以有多个非聚簇索引,非聚簇索引又称为助索引,二级索引等,主要用于快速定位 要查找的列。

补充回答

聚簇索引简单理解就是把索引和数据记录放在一起了,通过索引就可以直接找到数据行了,而非聚簇索引,还需要通过回表找到相应的数据记录。扩展回答 (引导思路及面试假想)

扩展回答

1:为什么聚簇索引查询速度快?

在lnnoDB中,聚簇索引指的是按照每张表的主键构建的一种索引方式,它是将表数据按照主键的顺序存储在磁盘上的一种方式。这种索引方式保证了行的物理存储顺序与主键的逻辑顺序相同,因此查找聚簇索引的速度非常快。

2:没有创建主键怎么办?

其实数据库记录中除了我们自己定义的字段外,还会添加一些隐藏字段,比如db_row_id,如果我们没有创建主键,会默认选择一个唯一索引作为聚簇索引,如果唯一索引也没有,默认就选择隐藏主键db_row_id作为聚簇索引l。

3:上面提到的回表是什么意思?

通常我们使用聚簇索就可以直接查找到数据记录,但是非聚簇索引由于它的叶子节点只存储主键值和索引值,这种情况下我们使用非聚簇索引查询相应的数据记录,需要先查到对应的叶子节点的主键值,然后再用主键值进行一次查询才能获得我们需要的数据记录,这个过程称为回表。

4:为什么主键查询效率快?

从上面的回答可以看出,主键索引查询数据记录不需要回表,减少了查询步骤,相应也提升的查询效率。

5:我们应该如何提升查询效率呢?

前面我们说到回表会降低查询效率,所以我们应该通过优化索引结构,添加相应的索引以及优化sql语句,减少回表的次数以提升查询的效率,同时我们也可以依赖覆盖索引、索引下推等技术。

6:既然你提到了索引下推,和索引覆盖,能否具体讲一下?

索引覆盖就是在索引中就包含了我们需要查询的数据列,比如我想查询column2,此时有一个索引记录(columnl,column2),那我们通过索引columnl进行查询 select column2 from table where column1='test’,上面的情况就是覆盖索引的例子,这种情况就不需要回表进行查询了。接下来讲下索引下推,这个也很好理解,首先我们需要了解,存储引擎只能根据索引例的值来定位到对应勺主键值,然后回表获取完整的记录行。如果查询条中还有其他未在索引中使用的筛选条件,那么这些条件只能在回表获取完整行之后在服务器层进行判斤。这就导致了很多不满足条件的记录也进行了回表桑作,增加了回表的次数。为了减少回表次数,我们可以利用索引下推技术在存储引擎层使用索引中的列来进行额外的筛选操作,而不仅仅是使用索引来定位已录的主键值。总结来说就是,索引下推就是联合索在本身数据就有的情况下,直接通过联合索引再进行一次数据的过滤,而不是通过回表返回到server层行数据的过滤。

3. MySQL 索引类型

数据结构分类:

  • B+Tree 索引(最常用,支持范围查询、排序)
  • Hash 索引(Memory 引擎支持,等值查询快,不支持范围查询)
  • R-Tree 索引(空间索引,MyISAM 的 GIS 数据)
  • Fulltext 索引(全文搜索,MyISAM/InnoDB 支持)

功能分类:

  • 主键索引(Primary Key)
  • 唯一索引(Unique Key)
  • 普通索引(Index)
  • 全文索引(Fulltext)
  • 空间索引(Spatial)

物理存储分类:

  • 聚簇索引(Clustered Index)
  • 非聚簇索引(Secondary Index / 非主键索引)
  • 覆盖索引(Covering Index,索引包含查询所需的所有列,无需回表)
  • 组合索引(Composite Index,多列联合索引)
  • 前缀索引(Prefix Index,对字符串前 N 个字符建索引)

拓展:

1.InnoDB为什么使用B+树实现索引?

1.B+树是一棵平衡树,每个叶子节点到根节点的路径长度相同,查询效率高

2.所有关键字都在叶子节点上,因此范围查询时只需要谣历一遍叶子节点即可。

3.叶子节点都按照关键字的大小顺序存放,因此可以快速的根据关键字大小进行排序。

4.非叶子节点不存储实际数据,因此可以存储更多的索引数据

5.非叶子节点适用指针链接叶子节点,因此可以快速的支持范国查询和倒序查询。

6.叶子节点之间通过 双向链表链接,方便进行范国查询。

所以可以总结得出,使用B+树有以下有几点,支持范围查询、支持排序、可以存储更多的索引数据、因为叶子节点大小固定,节点分裂和合并时,IO操作少,同时因为大小固定,还有利于磁盘预读,因为非叶子节点只存储指向子节点的指针,而不存储据,所以可以缓存更多的索引数据,有利于缓存。

2.B+树索引l和Hash索引有什么区别?

1.因为B+树索引将索引列的值按照大小排序存储,所以更适合于范围查询,而哈希索引是基于Hash表的结构,所以哈希索引更适合等值查询,但不适合范围查询和排序操作。

2.如果B+树索引插入数据和删除数据时需要调整索引结构,可能涉及到页分裂和页合并等操作(无序插入),维护成本较高,而哈希索引在插入和删除数据只需要计算哈希值并插入或者删除相应的记录。

3.B+树索引在磁盘上是有序存储的,而哈希索引是无序存储的

3.唯一索引和主键索引的区别?

两者都具有唯一性,但是主键索引不能为null,唯一索引可以,主键索引每表只能有一个,唯一索引可以创建多个,在innoDB中,主键索引就是聚簇索引,但唯一索引通常是非聚簇索引(除了特殊情况,就是在没有创建主键索引的情况下,MySQL会默认选择一个唯一的非空索引I作为聚簇索引),同时主键索引一定不需要回表,但是唯一索引查询通常是需要回表的,主键可以被其他表引用为外键,而唯一索引不可以。

4.MySQL如何保证唯一索引I的唯一性?

在支持事务的存储引擎中(例如lnnoDB)中,事务机制和锁定协议帮助维护索引的唯一性,当个事务正在修改索引引列时,其他事务对相同键值的修改会被适当的阻塞,直到第一个事务提交或回滚,确保了数据的一致性和唯一性,并且在实际的写入数据到磁盘之前,MySQL也会执行约束检查,确保不会违反唯一性约束。相应的因为唯一索引保证了指定列的值唯一,会让唯一性索引查询比非唯一性查询根块,因为能够快速的匹配到唯一的记录,但是也是因为要保证索引列的唯一性,因此在插入的时候需要检查是否存在相同的索引值,会对插入性能产生一定的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95368.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95368.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95368.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI时代的SD-WAN异地组网如何落地?

在全球化运营与数字化转型浪潮下,企业分支机构、数据中心与云服务的跨地域互联需求激增。传统专线因成本高昂、部署缓慢、灵活性差等问题日益凸显不足。SD-WAN以其智能化调度、显著降本、敏捷部署和云网融合的核心优势,成为实现高效、可靠、安全异地组网…

css中的color-mix()函数

color-mix() 是 CSS 颜色模块(CSS Color Module Level 5)中引入的一个强大的颜色混合函数,用于在指定的颜色空间中混合两种或多种颜色,生成新的颜色值。它解决了传统颜色混合(如通过透明度叠加)在视觉一致性…

Github desktop介绍(GitHub官方推出的一款图形化桌面工具,旨在简化Git和GitHub的使用流程)

文章目录**1. 简化 Git 操作****2. 代码版本控制****3. 团队协作****4. 代码托管与共享****5. 集成与扩展****6. 跨平台支持****7. 适合的使用场景****总结**GitHub Desktop 是 GitHub 官方推出的一款图形化桌面工具,旨在简化 Git 和 GitHub 的使用流程,…

整数规划-分支定界

内容来自:b站数学建模老哥 如:3.4,先找小于3的,再找大于4的 逐个

JetPack系列教程(六):Paging——让分页加载不再“秃”然

前言 在Android开发的世界里,分页加载就像是一场永无止境的马拉松,每次滚动到底部,都仿佛在提醒你:“嘿,朋友,还有更多数据等着你呢!”但别担心,Google大佬们早就看透了我们的烦恼&a…

扎实基础!深入理解Spring框架,解锁Java开发新境界

大家好,今天想和大家聊聊Java开发路上绕不开的一个重要基石——Spring框架。很多朋友在接触SpringBoot、SpringCloud这些现代化开发工具时,常常会感到吃力。究其原因,往往是对其底层的Spring核心机制理解不够透彻。Spring是构建这些高效框架的…

Heterophily-aware Representation Learning on Heterogeneous Graphs

Heterophily-Aware Representation Learning on Heterogeneous Graphs (TPAMI 2025) 计算机科学 1区 I:18.6 top期刊 📌 摘要 现实世界中的图结构通常非常复杂,不仅具有全局结构上的异质性,还表现出局部邻域内的强异质相似性(heterophily)。虽然越来越多的研究揭示了图…

计算机视觉(7)-纯视觉方案实现端到端轨迹规划(思路梳理)

基于纯视觉方案实现端到端轨迹规划,需融合开源模型、自有数据及系统工程优化。以下提供一套从模型选型到部署落地的完整方案,结合前沿开源技术与工业实践: 一、开源模型选型与组合策略 1. 感知-预测一体化模型 ViP3D(清华&#…

Nginx 屏蔽服务器名称与版本信息(源码级修改)

Nginx 屏蔽服务器名称与版本信息(源码级修改) 一、背景与目的 在生产环境部署 Nginx 时,默认配置会在 Server 响应头中暴露服务类型(如 nginx)和版本号(如 nginx/1.25.4)。这些信息可能被攻击者…

从钢板内部应力视角,重新认识护栏板矫平机

一、为什么钢板会“自带波浪”? 钢卷在热轧后冷却、卷取、长途运输、多次吊运时,不同部位受到的温度、张力、碰撞并不一致,内部会产生不均匀的残余应力。应力大的区域想“伸长”,应力小的区域想“缩短”,宏观上就表现为…

C++中的`auto`与`std::any`:功能、区别与选择建议

引言 在C编程中,auto和std::any是两个功能强大但用途不同的工具。理解它们的区别和适用场景对于编写高效、可维护的代码至关重要。本文将详细介绍auto和std::any的基本概念、使用方法、适用场景以及它们之间的区别,并提供选择建议,帮助开发者…

【Linux】进程(Process)

一、什么是进程二、进程的创建三、进程的状态四、僵尸进程五、孤儿进程六、进程的优先级 以及 并发/并行七、进程的切换一、什么是进程?什么是进程呢(一)?官方话来说:进程是一个执行实例、正在执行的程序、是系统资源分配的基本单位按课本官方话可能有一…

销售管理系统哪个好?14款软件深度对比

本文将深入对比14款销售管理系统:1.纷享销客; 2.Zoho CRM; 3.神州云动 CRM; 4.励销云 CRM; 5.Microsoft Dynamics 365 CRM; 6.悟空 CRM; 7.泛微 CRM; 8.HubSpot CRM; 9.…

如何从 0 到 1 开发企业级 AI 应用:步骤、框架与技巧

本文来自作者 莫尔索 的 企业级 AI 应用开发与最佳实践指南, 欢迎阅读原文。 大家好,我之前出版的《LangChain 编程:从入门到实践》一书获得了良好的市场反响和读者认可。近期推出了第二版,我对内容进行了大幅更新:近 …

【LLM】Openai之gpt-oss模型和GPT5模型

note gpt-oss模型代理能力:使用模型的原生功能进行函数调用、网页浏览(https://github.com/openai/gpt-oss/tree/main?tabreadme-ov-file#browser)、Python 代码执行(https://github.com/openai/gpt-oss/tree/main?tabreadme-o…

Ubuntu 20.04 虚拟机安装完整教程:从 VMware 到 VMware Tools

目录 一、VMware的安装 1. 资源获取 1. 网盘提取 2. VMware官网,选择自己合适的版本,我下载的是16.2版本 2.安装步骤 二、Ubuntu的安装 1. Ubuntu 镜像文件官网下载 2. Ubuntu的安装步骤 第一步:打开刚刚安装好的VMware16.2.0&#…

【DL】最优化理论和深度学习

最优化理论是计算机科学中一个重要的概念,它用于帮助我们找到最优解(即最小或最大值)的算法。在深度学习中,最优化理论用于帮助深度学习模型找到最优解。训练误差(Training Error):指模型在训练…

商品分类拖拽排序设计

商品分类、菜单项以及其他需要排序的元素常常会用到拖拽排序功能。这个看似简单的交互背后,其实涉及到一系列复杂的后端逻辑处理,尤其是在如何高效地更新数据库记录方面。本文将探讨两种常见的实现方案,并分析各自的优缺点,帮助你…

ROS机器人云实践设计申报书-草稿

ROS机器人云实践作品申报书 ROS机器人云实践设计一、项目基本信息 项目名称:基于ROS的移动机器人云实践平台设计与应用 申报单位:[具体单位名称] 项目负责人:[具体参与人员] 申报日期:[填写日期] 二、项目背景与目标 项目背景&…

Jira 根据问题类型 为 描述 字段添加默认值

背景: jira 8.16 想要为问题类型为 需求 的问题默认增加描述字段默认值 想都没想直接根据之前添加缺陷类型时描述默认值的方式去添加(系统字段--描述--上下文和默认值--添加上下文), 结果不随我愿, 系统默认的这个功能不能根据问题类型切换而切换不同的默认值, 只能设置 1 个…