MySQL相关的面试题 MySQL存储引擎与索引机制深度解析

MySQL官方提供了10种存储引擎,主要用的有InnoDB、MyISOM、MEMORY

  • InnoDB是MySQL5.5后的默认存储引擎,他支持事务、行级锁、外键,适合读写高并发的场景。
  • MyISAM是MySQL5.5之前的默认存储引擎,不支持事务、只有表级锁,没有外键,适合读多写少的场景。
  • MEMORY是一种基于内存的存储引擎,速度快,但重启后数据就丢失了,适合做零时表和会话级缓存。

InnoDB和MyISA的区别?

  • InnoDB的聚簇索引中索引和数据是存放在一起的数据存放在B+树的叶子节点,而MyISAM的索引和数据是分开存放的,叶子节点存放的是数据的物理地址
  • InnoDB也支持数据持久化也就是(持久性)通过redo log日志来保证,而MyISAM不支持

InnoDB的行级锁是怎么实现的?

要看他是否走索引了。如果走二级索引的话,会先锁二级索引的行,再锁聚簇索引的行;如果走聚簇索引,直接锁聚簇索引的行;如果没有走索引的话,会退化为表锁,锁住整张表来扫描全表。

MyISAM只有表锁,为什么说他读的性能好?

因为MyISAM不需要维护undo log 和mvcc,直接在B+树的叶子节点取数据的物理地址,然后找数据,InnoDB有时需要回表查询。

MEMORY与Redis的区别?

  • MEMORY是进程内的内存存储,不能跨进程访问,没有持久化,数据重启就丢失。
  • Redis 有持久化机制,可以跨进程访问

怎么查看当前表的搜索引擎?

SHOW TABLE STATUS LIKE 'table_name'

MySQL的innoDB存储引擎中聚簇索引和非聚簇索引的区别?

聚簇索引只能有一个,他的非叶子节点存放索引,叶子节点存放整行数据,而非聚簇索引可以有多个,叶子节点存放索引列的值和主键

为什么主键要递增?

因为聚簇索引的数据是按照主键的顺序排列的,如果主键无序的话,添加数据会在中间的叶子节点添加,而每个叶子节点的内存是有限的,会产生页分裂,降低插入效率。如果是递增的话,每次都会追加到末尾,不会产生页分裂。

如果一张表没有主键InnoDB会怎么处理聚簇索引?

他会找第一个非空唯一的列做为聚簇索引,如果没有非空唯一的列,InnoDB会生成一个6字节的隐藏字段做聚簇索引。

为什么非聚簇索引的叶子节点存的是主键,而不是物理地址?

因为聚簇索引的物理地址不固定,每次页分裂和页合并都会影响物理地址,从而修改非聚簇索引的叶子节点,维护成本太高。

MySQL有哪些索引?

按照数据结构分:

复制代码
B+树索引:InnoDB和MyISAM都是B+树索引,多层平衡树结构,三层树高就能存储2000万条数据,任何一个数据经过三次磁盘IO就能找到,叶子节点之间通过双向链表连接支持范围查询
哈希索引:通过hash函数算出数据位置,查询效率O(1),不支持范围查询和排序
全文索引:把文本分词后建立倒排索引,类似于搜索引擎。适合文章内容检索。

按照InnoDB的存储方式来分

复制代码
聚簇索引
非聚簇索引

字段特性来分

复制代码
主键索引
唯一索引
普通索引
前缀索引

按字段个数分

复制代码
单列索引
联合索引
相关推荐
晚霞的不甘6 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位6 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
海奥华26 小时前
mysql索引
数据库·mysql
2601_949593657 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__7 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102167 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light7 小时前
MySQL相关问题
数据库·mysql
蜡笔小炘8 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长8 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚8 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构