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的实现不同:
2.innodb引擎下,数据记录是保存在B+树的叶子节点(大小相当于磁盘上的页)上,当插入新的数据时,如果主键的值是有序的,它会把每一条记录都存储在上一条记录的后面,但是如果主键使用的是无序的数值,例如UUID,这样在插入数据时Innodb无法简单地把新的数据插入到最后,而是需要为这条数据寻找合适的位置,这就额外增加了工作,这就是innodb引擎写入性能要略差于MyISAM的原因之一。
6.索引中聚簇索引和非聚簇索引:
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因;
户枢不蠹,流水不腐