分布式存储--Mysql--序列1--聚簇索引&非聚簇索引

本人新书出版,对技术感兴趣的朋友请关注:
分布式存储--Mysql--序列1--聚簇索引&非聚簇索引_第1张图片

https://mp.weixin.qq.com/s/uq2cw2Lgf-s4nPHJ4WH4aw

从本篇开始,将进入分布式系统的存储的讨论。存储一直是设计分布式系统中最最核心的问题,这里面设计到诸多设计策略。

而Mysql作为一个开源的数据库,在各大互联网公司使用极为普遍。本系列将从Mysql开始,一步步展示关于存储设计的诸多策略。

说到InnoDB和MyISAM的区别,很多人都会提到一个支持事务,一个不支持;一个是行锁,一个是表锁(这个其实不准确,后面会详细阐述)。

但跟日常使用最密切相关的,更基本的,其实是另外一个关键区别:InnoDB是聚簇索引,MyISAM是非聚簇索引。如下图所示:

MyISAM的非聚餐索引:数据和索引是分开存放的
分布式存储--Mysql--序列1--聚簇索引&非聚簇索引_第2张图片

InnoDB的聚簇索引: 数据和主键索引是存放在一起的,其他索引叶子结点存放的主键id。
分布式存储--Mysql--序列1--聚簇索引&非聚簇索引_第3张图片

那这种不同,对于我们日常使用,又有什么影响呢?

查询

很显然,对于MyISAM,要查2次,先查1次索引,再查一次数据; 而对于InnoDB的主键查询,因为数据和索引存放在一起,只需要查1次,显然性能更快。

所以如果你采用了InnoDB,尽量让上层业务通过主键查询。

插入

对于MyISAM,数据总是顺序在文件末尾添加;而对于InnoDB,如果主键是自增ID,那数据也会是在文件末尾按顺序append。

但如果你用了InnoDB,但主键又不是自增,那就会发生B+树中间叶子结点的split,对应的,就会发生文件的随机读写,而不是顺序写入,这会极大的影响性能。

所以,如果你采用了InnoDB,尽量把主键设成自增ID。

下篇将开始介绍索引的设计策略。

你可能感兴趣的:(分布式架构-中间件)