Mysql能够说是最普遍使用的数据库之一了,体积小,成本低,开源(免费才是王道呀-。-),本文旨在和你们一块儿探索Mysql的一些相关知识,不只要会用它来写sql,更要学习它的底层设计和技术延伸。mysql
Mysql索引是基于B+tree的数据结构来设计的,那么为何不使用二叉树,Hash(实际上是支持的),B-tree等结构来设计索引呢?sql
树的层数太高,容易退化成链表数据库
层数仍然太高,会大大增长系统的IO频率缓存
Mysql是支持Hash索引的,只不过Hash索引不支持范围查找,而咱们在平常工做中须要普遍的运用到范围查询数据结构
1.在B-tree和B+tree中,每个节点叫作一个磁盘页,每个磁盘页的大小是16K,那么相比较于B-tree是在每一个节点上都存储数据,B+tree是只在叶子节点上存储数据,相同层数下,B+tree能存储的数据量要大于B-tree
2.B+tree的叶子节点有双向指针,对于范围查找的效率能大大提高并发
Mysql中有不少种存储引擎,咱们这里主要介绍的是MyISAM和InnoDB。学习
打开不一样引擎的表的存储文件夹,会发现这两种引擎用来保存相关数据的文件不一样:
MyISAM设计
.frm文件:存储表结构
.MYD文件:存储数据
.MYI文件:存储索引
查询时,若是有索引,在MYI文件中根据索引获取数据地址,再去MYD文件中查找到数据
InnoDB指针
.frm文件:存储表结构
.ibd文件:存储索引和数据
索引和数据都存储在ibd文件
除了存储文件上的区别,MyISAM和InnoDB还有如下的区别:索引
那么,何时使用哪一个最好呢?通常来讲,系统业务涉及到查询占大部分,对事务需求度低,容忍度高的,能够使用MyISAM引擎,MyISAM查询效率要高于InnoDB。反之,系统涉及并发量大,须要大量的增删改操做,建议使用InnoDB引擎。
tips:MyISAM查询效率更高,是由于:InnoDB要缓存数据块,而MyISAM只要缓存索引块;在select的时候InnoDB须要去维护MVCC(多版本并发控制);InnoDB查询须要映射到块再到行,而MyISAM直接记录文件的offset,定位更快
使用InnoDB时的tips:
1.基于上面的设计,InnoDB必须设置主键索引,因此通常建议咱们在进行表的设计的时候都要添加主键列,若是不设置主键,mysql会在表中寻找一个惟一列来当作主键索引,若是没有这样的列,它会去维护一个虚拟列,用以创建主键索引
2.主键尽量的要设置成自增整型类型,由于最终在B+tree中是须要去比较索引大小的,若是是非整型的,或者是无序的主键,还须要先去进行值转换,无疑增长了额外时间开支