Mysql的相关知识

mysql的搜索引擎:

首先我们要知道mysql的搜索引擎一共有几种;

我们的常用引擎大概分为MYISYM 和INNODB两种搜索引擎;其次这两种都是基于数据库中的表,而不是mysql;是针对于表的。(常识问题,一定要知道!)

其次,在对于这两种搜索引擎,是有不相同的索引存储方式的;

mysql的存储数据结构:

在mysql中存储数据时,大部分都分为两种情况:

hash存储:

对于hash表的存储方式我们都不陌生,类似于hashmap,使用一种数组加链表的存储方式,根据hash算法首先计算出索引位置,然后进行数据(桶)中的存储,当发生hash碰撞时,就在此节点上生成链表进行后插存储;

其实在这种存储方式的效率也是相当高的,因为在存储以后,我们就查询的过程中,只需要找到索引位置,向后遍历就可以快速拿到此条数据;但是为什么不用呢?

答案是因为hash索引是无法进行范围查找的;

这时就要说说为什么b+树在数据结构上强于hash;

B+树的实现

我们都知道二叉树的规则,根子节点建立以后,左边存储比它小的,右边存储比它大的;

但是又缺点,假如按顺序存储1-7;就又成了链表;所以就要引入平衡二叉树,通过平衡树的高度来让数据更加合理一些,所以这时我们如果又感觉使用红黑树又可以了;(因为红黑树也是平衡二叉树的一种)

但是我们又想想,当我们存储很多的数据呢,比如1000万数据,那我们就算用红黑树也需要很多层树才可以存完,那时我们想想,我们查一条根子节点数据的时候,是不是还是要查询好多次(假设每层树都可以准确找到,那我们也要每层树都要找)

所以又要开始升级,就有了b+树,通过在树的根子节点上分配更多的内存,用来存储更多的索引来减少io;

这时就引出了我们数据库的存储结构:

b+树的根节点上存储的都是加载在内存中的索引元素,并且这存储时是通过从左到右的顺序进行排列;(期间有冗余)在冗余其中就存储着排序中间的数据索引位置;通过索引和之间的存储位置来直接找到此索引,INNODB引擎就会直接把这条数据和这个索引存储在一起,(这种就叫做聚簇索引,非聚簇索引就是在索引的位置存储着数据的磁盘地址,分开存储,属于MYISYM的存储方式);这样就快速找到了;

这时我们的主键索引就结束了,但是还有我们的普通索引:

mysql除了维护这么个主键索引树,还会维护一个同样的普通索引树,数据结构是一摸一样的,但是在根子节点上存的普通索引对应的就不是整个数据了,而是主键索引;(相当于一次回表:

通过普通索引查询完成后拿到主键索引,然后进行主键查询,进而拿到这条数据;

除了主键索引和普通索引,还有联合索引:

在使用联合索引时,就需要了解一个查询机制:最左原则

比如:select * from t_test where name= 1 and age = 2 and sex = "男"

其中如果name和age和sex设置联合索引时的顺序是(name,age,sex);

那么这个语句就会通过索引快速查询到结果,但是如果不是;就会索引失效

因为在建立联合索引时,数据库在存的时候,就是根据这个数据依次从左到右,首先排序name,age,sex,完了以后进行对应的数据存储;因此在拿的时候如果不按顺序拿,你根本不知道你拿完了没有:

如果一条name是张三,一条是李四, 两条age都是30;

那你拿的时候先找到了李四的age是30,但是还没有拿完,因为这时你不知道到底向右还是向左,不是根据这个索引的顺序来存的,所以就要全表扫;这不就是索引失效嘛?

因此:一定要记得使用联合索引时,虽然会增加效率,但是一定要最左原则;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值