看到数据库面试题三道:
- MySQL 的存储引擎有哪些?它们之间有什么区别?(中等)
- MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?(中等)
- MySQL 的索引类型有哪些?(简单)
所以来聊一聊关于mysql的话题:
1. MySQL 的存储引擎有哪些?它们之间有什么区别?
主流上mysql有两种存储引擎,INNODB和MYISAM,相比之下用的较少的还有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+树搜索完给出指针,用指针反查,聚簇索引把指针给换成了数据。如果没有主键,就会找唯一非空作为索引,如果啥都没有,就自己创建一个隐藏列。