985 字
5 分钟
mysql的存储类型与索引
2026-03-09

看到数据库面试题三道:

  • MySQL 的存储引擎有哪些?它们之间有什么区别?(中等)
  • MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?(中等)
  • MySQL 的索引类型有哪些?(简单)

所以来聊一聊关于mysql的话题:

1. MySQL 的存储引擎有哪些?它们之间有什么区别?#

主流上mysql有两种存储引擎,INNODBMYISAM,相比之下用的较少的还有memory、achieve、NDB等等。

MYISAM是mysql5.0以前使用的,速度特别快,效率高,但很容易出现安全问题,也只支持表锁,适合早期互联网刚兴起的时期。

INNODB是mysql5.0以后使用的,为了对标企业需求,创建的带有事务、行级锁的存储引擎。相对MYISAM来说多了许多功能,增加了安全性,但(纯查询)的效率有所降低。有mvcc,可以避免读写冲突,读旧写新。也是唯一有外键限制的存储引擎,可以增加安全性。

官方更倾向于INNODB,并且在mysql8.0中把系统用表完全迁移INNODB。INNODB存储量相对较小,myisam是他的几倍。

NDB是企业级数据集群存储,用于大批量分片存储,内存要求大,但存储数据可达到百EB级别。因为目的是快,所以不支持数据压缩。

myisam性能好是不支持事务导致开销小,但是因为他的表锁,就会导致高并发时候性能糟糕。

可以用 show table status from 数据库 like "表名"; 来看是什么类型。

另外,在改数据库的时候可以在数据表里添加version版本号,通过where查询实现乐观锁,以免数据覆盖。

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

聚簇索引一个表只有一个,存放完整数据和主键。非聚簇索引有多个,只存放相应的索引列的值和主键,还需要用主键去取真正的值,这就导致多了一个回表操作。聚簇索引本质就是b+树,但b+树搜索完给出指针,用指针反查,聚簇索引把指针给换成了数据。

3. MySQL 的索引类型有哪些?#

对于索引来说:

数据结构:

  • b+树索引:则只有achieve不支持,可以快速定位,可以进行范围和等值两种,速度比较快,而且树高矮,对硬盘进行了优化。
  • 哈希索引:查询准、快,但不支持查范围和模糊匹配,哈希冲突时性能下降(多数据指向同一个哈希),另外也不支持排序,适用于ndb和memory。
  • 全文索引:innodb、myisam都支持,适用于文章,但是空间大,分词建倒排索引,类似搜索引擎,不过对中文兼容不太好,相比like全盘扫描效率高。
  • 空间索引:处理地理坐标位置等数据。

索引性质:

唯一索引、普通索引、主键索引、全文索引、空间索引。

联合索引:多列一个索引,最左前缀原则,也就是先查大的再查小的,要是反过来就不会用索引。

在innodb里面,聚簇索引把数据和索引放一起,加快速度,而默认就是他的索引。聚簇索引一个表只有一个,存放完整数据和主键。非聚簇索引有多个,只存放相应的索引列的值和主键,还需要用主键去取真正的值,这就导致多了一个回表操作。聚簇索引本质就是b+树,但b+树搜索完给出指针,用指针反查,聚簇索引把指针给换成了数据。如果没有主键,就会找唯一非空作为索引,如果啥都没有,就自己创建一个隐藏列。

mysql的存储类型与索引
https://fuwari.vercel.app/posts/mysql的存储类型与索引/
作者
喵呜
发布于
2026-03-09
许可协议
CC BY-NC-SA 4.0