mysql存储引擎

mysql的底层架构:

1.mysql的存储引擎:5.5之前mylsam,5.5之后innodb;

mylsam与innodb的区别:

innodb支持行级锁,事务,数据崩溃恢复,支持外键;mylsam不支持这些; 

 

2.mysql的存储结构:

innodb的存储结构页:

 

 

 sql语句:select * from usertable where userid="xx";

底层数据结构mysql中的多个数据页通过双链表来连接的,而每个数据页中的行记录是通过单链表连接的

底层查找:1.先去遍历双向链表数据页,找到我们记录所在的数据页;

     2.如果where是主键查找,可以通过二分法找到我们页中的行记录;

      如果where不是主键查找,则通过遍历的方式找到我们页中的行记录;

时间复杂度为O(n)

3.索引: 将我们的数据页变为相对有序的状态,类似目录结构 ;查找数据页算法为二分查找,时间复杂度为O(logn);

3.1.索引的其底层数据结构B+树

 

 3.2.索引的匹配原则:最左前缀匹配

3.3.避免冗余索引:aa,bb和aa的两个索引,前者找到后者一定能找到;

3.4索引使用:

创建主键索引:

a.添加PRIMARY KEY(主键索引)

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

b.添加UNIQUE(唯一索引)

ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 

c.添加INDEX(普通索引)

ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

d.添加FULLTEXT(全文索引)

ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 

e.添加多列索引

ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

查询索引

explain select * from tablename

4.mysql约束:主键约束,外键约束,唯一约束,非空约束,默认约束;

5.mysql索引中的btree索引在myiam和innodb的实现不同:

1.Innodb辅助索引的叶子节点存储的不是地址,而是主键值,这样的策略减少了当出现行移动或者数据页分裂时辅助索引的维护工作,虽然使用主键值当作指针会让辅助索引占用更多空间,但好处是,Innodb在移动行时无需更新辅助索引中的主键值,而MyISAM需要调整其叶子节点中的地址。

2.innodb引擎下,数据记录是保存在B+树的叶子节点(大小相当于磁盘上的页)上,当插入新的数据时,如果主键的值是有序的,它会把每一条记录都存储在上一条记录的后面,但是如果主键使用的是无序的数值,例如UUID,这样在插入数据时Innodb无法简单地把新的数据插入到最后,而是需要为这条数据寻找合适的位置,这就额外增加了工作,这就是innodb引擎写入性能要略差于MyISAM的原因之一。

6.索引中聚簇索引和非聚簇索引:

聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据

非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因;

澄清一个概念:
innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找;
非聚簇索引都是辅助索引;
其他:复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理地址,而是主键值;
 
7.mysql使用innodb引擎时,创建表示没有创建主键,会默认生成一个隐式主键为聚簇索引
 
8.mysql使用innodb引擎时,每张表有且只有一个聚簇索引
 
9.innodb和myisam中实现b+树中的非叶节点包含的信息:数据文件个数;数据文件;指向下一个子节点的指针
 
innodb和myisam的索引机制:https://www.cnblogs.com/xiaoxi/p/6868087.html
 

 户枢不蠹,流水不腐

posted @ 2020-02-25 21:15  ZJfor  阅读(174)  评论(0编辑  收藏  举报