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

来源:互联网 发布:linux awk 函数 编辑:程序博客网 时间:2024/05/16 04:42

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

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

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

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

MyISAM的非聚餐索引:数据和索引是分开存放的
这里写图片描述

InnoDB的聚簇索引: 数据和主键索引是存放在一起的,其他索引叶子结点存放的主键id。
这里写图片描述

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

查询

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

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

插入

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

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

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

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

0 0
原创粉丝点击