最近把mysql的知识重新梳理了下。分几个点。
- mysql索引结构
- mysql查询优化
- mysql事务
- mysql架构设计
- mysql高可用
这篇写一些索引结构。先搞几个问题
1、mysql的存储引擎知道哪几个?--innodb、myisam
2、innodb和myisam有啥区别?
- 锁的区别。myisam只支持表锁,innodb还支持行锁;
- 事务支持上,innodb支持,myiasm不支持。
- 数据文件结构。innodb的索引和数据是一个文件存放。myisam索引和数据但两个文件。同时innodb支持聚簇索引,myisam不支持聚簇索引。
首先存储引擎是表级别的,这个在创建表的时候设定。大部分的业务用的都是innodb。
那innodb支持哪几种结构的索引呢?
1、hash索引:优点在于where条件查找快,缺点在于可能hash冲突,且不适合范围查询
2、b+树:无论是聚簇索引还是二级索引,底层的数据结构都是b+树。
mysql b+树索引的特点:数据都存储在叶子节点,非叶子节点只存储索引数据,整棵树索引存在冗余;叶子节点中索引顺序排列,节点与节点之间由双向指针维护。
为什么选用b+树结构,为什么不选择b树呢?b+树有着天然优势
- 首先对于b树而言,节点是不冗余的,那么数据需要存储在每个索引之下,这就导致每个几点能够存储的索引数据少很多(mysql的数据按页存储,一页16kb,可以理解为1个节点16kb,如果是b树结构,算一个索引几十b,一行数据1kb,1个几点也只能存储10多个索引数据。但是对于b+树而言,非叶子节点只存储索引,那么一个节点最多就可以存几百个索引。mysql每次读取一个节点(一页数据)的数据到内存,计算下一次该走哪一个子树,使用b+,可以减少很多次io);
- b+的叶子节点是双向指针连接的,适合范围查询,而b树在范围遍历的适合,需要回溯,逻辑复杂。
为什么innodb建议创建主键,并且自增类型?
- 首先,如果不定义主键,innodb引擎也会给表增加一列隐式列rowid,并且将其构建为聚簇索引。
- 聚簇索引和表数据一起构建,如果不是设置自增类型,在索引随机插入的情况下,会导致页分裂,会消耗更多的mysql性能。
(有时间补充下图)
标签:总结,存储,聚簇,索引,innodb,mysql,节点 From: https://www.cnblogs.com/wzllzw/p/16807897.html