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的存储方式来分

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

字段特性来分

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

按字段个数分

复制代码
单列索引
联合索引
相关推荐
longxibo2 小时前
mysql数据快速导入doris
android·大数据·python·mysql
Full Stack Developme2 小时前
达梦(DM8)基于 LBS(位置服务)教程
服务器·网络·数据库
小湘西2 小时前
数仓分层架构详解2:ODS、DWD、DWS
大数据·数据库·数据仓库
「、皓子~2 小时前
AI创作系列35 海狸IM桌面版:本地数据库的设计艺术
数据库·golang·毕业设计·开源软件·im·社交软件
鹿角片ljp2 小时前
Java深入理解MySQL数据库操作
java·mysql·adb
谷哥的小弟2 小时前
SQLite MCP服务器安装以及客户端连接配置
服务器·数据库·人工智能·sqlite·大模型·源码·mcp
1.14(java)2 小时前
掌握数据库约束:确保数据精准可靠
java·数据库·mysql·数据库约束
Codeking__2 小时前
Redis——value的数据类型与单线程工作模型
java·数据库·redis
rchmin2 小时前
MySQL主从复制原理详解
数据库·mysql