mysql 索引

数据或者一些文件系统一般用什么数据结构来存储?
一般使用二叉树,b树 或者b+树来存储,也可以用hash表
为什么mysql不用hash表来存储? hash表的时间复杂度理论上可以达到0(1)?
虽然hash表的时间复杂度对于key可以达到1,但是对于模糊查询就不起作用了,例如联合索引,就相当于无效了,且对于范围查询,例如查询seq_no 在一定范围的时候,需要进行n次查询,显然这样是不合理的,对于顺序查询无法支持。

为什么不用二叉树?
要知道理论上二叉树的速度要比b 树快,因为b树属于范围查找,需要遍历节点,而二叉树只有左右两个孩子,理论上速度会更快,但是由于b树是多路的,因此查找层树的次数就少了,这样加载磁盘的次数也小了,要知道对于mysql 硬盘存储来说,性能瓶颈只要是加载磁盘,而不是内存遍历,对于cpu在内存的操作是快速的,因此二叉树性能就比不了b树了。
第二个原因是:对于mysql来说,节点的存储是连续的,磁盘最喜欢顺序io,因此可以一次性加载page,然后可以拿到该节点所有的子节点分布地址,因此一次加载就可以拿到下一层的节点地址;而对于二叉树来说,因为每一层的地址可能不会连续,每一层都需要进行加载,因此b树性能远远好于二叉树。

b树和b+树有什么区别?
1.b树的非叶子节点是可以存储数据的,也就是说一个数据在树中只能出现一次。
2.b+树的叶子节点才会存储数据,非叶子节点只负责索引,且节点会重复,但是叶子节点不会重复。
3.B+树的叶子节点都有一个指针,用来指向下一个叶子,因此对于范围查询来说,b+树直接在叶子上进行推进,而b树需要中序遍历。

mysql的myisam和innodb的索引区别:
首先innodb和myisam都使用b+树来构建索引,区别是,对于myisam,索引和数据是分开的,用3个文件表示,且索引的叶子节点存储的是data的物理地址,而innodb 是聚簇索引,叶子节点存储的是具体的data,所以innodb在默认情况下共享表时为一个文件。
innodb表需要一个unique /primarykey, 如果没有,会自动生成,且隐藏,二级索引的叶子会指向聚簇索引的ID,因此二级索引进行查询的时候实际上会先查到primarykey,然后在找到具体的数据。而myisam的二级索引叶子节点就是具体的data地址。

innodb 和myisam的区别:
1.索引的区别。
2.索引数据文件的区别。
3.myisam支持full text key。 innodb新版本也支持。
4.对于count 操作,myisam快,因为myisam维护了count的信息,而innodb需要扫描表。
5.innodb支持事物,有行级锁,见习锁,排他锁,共享锁,而myisam只有表锁。
6.对于查询比较多的,用myisam效率高。
7.innodb的数据恢复可以依赖事物日志来进行,而myisam需要对文件进行恢复,因此myisam可以拷贝文件来进行恢复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值