一、存储引擎
什么是存储引擎
存储引擎就是mysql中的一个组件,这个组件的作用就是为不同的表类型来处理SQL操作.
简单来说,存储引擎的作用就是处理SQL操作的.
查看所有的存储引擎:SHOW ENGINES
MYISAM、INNODB、MEMORY的区别
对比项???????????????????????? | MyISAM | InnoDB | MEMORY | 外键 | 不支持 | 支持 | 不支持 | 事务 | 不支持 | 支持 | 不支持 | 行表锁 | 表锁,操作任何一行数据都会锁住整个表 | 行锁,只锁定操作的行,适合高并发 InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁 | 表锁,操作任何一行数据都会锁住整个表 | 缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引,还要缓存真实数据,对内存的要求较高,而内存大小对性能影响也较大 | | 关注 | 节约资源,消耗少,简单业务 | 并发,事务,更大资源 | | 默认安装 | Y | Y | | 默认使用 | N | Y | | 自带系统表使用 | Y | N | | 集群索引???????????????? | 不支持 | 支持 | 不支持 |
使用场景 | 以查询为主,较少的更新删除操作,对事务完整性、并发性要求不高的情况 | 对事务的完整性有比较高的要求,并发情况下要求数据一致性 | 更新不频繁的小表,用来快速得到访问结果 |
三、索引
什么是索引?
索引是帮助mysql高效获取数据的数据结构,一般来说索引本身也很大,不能全部存在内存中,因此索引往往保存在硬盘中
索引的优势
提高了检索效率,降低了数据io成本
通过索引对数据进行排序,降低了数据排序的成本,降低了cpu的消耗
索引的劣势
虽然索大大提高了查询速度,但是同时降低了更新表的速度,比如对表进行更新了之后,mysql不仅要更新数据,还要更新索引文件
索引也是一张表,保存了主键与索引字段并指向实体表的记录,所以也占用了不少空间
索引分类
按照功能分类:
普通索引:最基本的索引,没有任何限制
唯一索引:索引列的值必须唯一,但允许空,如果是组合索引,列值组合必须唯一
主键索引:一种特殊的唯一索引,不允许空,在建表时主键列同时创建主键索引
联合索引:将单列索引进行组合
外键索引:只有InnoDB支持,用来保证数据一致性,完整性和实现级联操作
全文索引:快速匹配全部文档的方式,innodb5.6版本后才支持。memory不支持????????
按照数据结构分类:
B Tree索引:Mysql使用最频繁的索引,是Innodb和myisam存储引擎默认的索引类型,底层是基于b+tree
hash索引:mysql中menmory存储引擎默认支持的索引类型
磁盘存储的特点
系统从磁盘读取数据到内存时是以磁盘块为基本单位的,同一块磁盘块的数据会被一次性读取出来,而不是需要什么读取什么
例如有三个磁盘块,第一个磁盘块存储1、2、3,第二个磁盘块存储4、5、6,第三个磁盘块存储7、8、9.现在想要读取数据5,会将4、5、6都读到内存中。
B-TREE(以innodb为例):
?每个节点中不仅保存key,还保存着数据,会增加查询数据时磁盘的IO次数
B+Tree
非叶子节点只存储key,所有的数据都存储在叶子节点上,所有的叶子节点之间都有指针,方便进行范围查找
B-Tree和B+Tree的区别
?1、b-tree的关键字和数据都是放在一起的,而b+tree非叶子节点只有关键字和指向下一节点的指针,数据放在叶子节点上
2、在b-tree中,越靠近根节点的数据查找时间更快,只要找到关键字即可确认数据的位置,而b+tree中每个记录查找的时间基本上是一样的,都要从根节点出发到叶子节点,然后在每个叶子节点之间还需要计算,由于b+tree中非叶子节点不存放数据,所有可以容纳的元素更多,减少了io的次数,整体看上去树高比b-tree小。
3、b+tree的叶子节点使用指针连接在一起,方便顺序遍历
为什么选用b+tree作为索引数据结构
1、b+tree读写代价更低,它的非叶子节点不含数据信息,所以一块磁盘中能存放的索引就更多,一次读入内存中的关键字也就阅读,从而减少了磁盘io
2、b+tree读写更加稳定
3、b+tree的叶子节点使用指针连接在一起,方便了顺序遍历
|