1、父节点的元素会出现在子节点中
2、父节点存储了每个子节点的最大元素,可得出根节点的最大值为整棵树所有元素的最大值
3、叶子节点都在同一层,且叶子节点上包含了整棵树的所有元素,且存储了下个叶子节点的指针,是个有序链表
4、在b+树中,只有聚集索引的叶子节点上,才是真正的数据。非聚集索引的叶子节点上,存储的是指向聚集索引叶子节点上的指针。
5、B+树每一层的数量可以通过设置页的大小来决定,innodb_page_size,默认16k为一页 聚集索引的叶子节点是对应的行数据。每一页至少会存储两条数据,若数据太大,会把数据的前部分存到数据页中,剩下的数据,会存到后面的数据页中,并把后面的页地址存到叶子节点对应的页中
innodb的页最大填充因子是15/16,默认页大小为16k,超过后,会重新分配一个页
注意:mysql中的InnoDB引擎中,主键索引为聚集索引,二级索引并非非聚集索引(聚簇索引就是聚集索引,名字不同而已。MyISAM引擎中,主键和二级索引都为非聚集索引)
5、相比较b树,优点如下:
(1):节点中未包含卫星数据,因此,同一个磁盘块中可以存储更多的索引数量,减少IO次数。
(2):在进行范围查找时,由于数据都在叶子节点上,且是有序的,所以性能更好。
(3):在进行查找时b树为查到数据就停止了,而b+树是每次查找都会查到叶子节点才结束,因此b+树在进行查找时比较稳定(难道不应该是b树相对来说比它的性能快吗)
6、没有主键时,先找第一个不为空null的唯一索引当作主键,如果没有,就生成一个隐藏的主键 二级索引存储主键的值,而不是值的指针
优点是:减少了当出现行移动或行分裂时,对二级索引的维护工作
缺点是:当主键的值占用空间很大时,也会导致二级索引占用的空间变大
ddl:对表结构操作 dml:对表数据操作。增删改查都属于dml innodb支持行级锁,myisam不支持行级锁
写是排他锁,写锁意味着本线程可以读写,其他线程不能读也不能写。读锁是共享锁,加上后本线程不能写,其他线程只能读不能写。
在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
在对表进行增删改查数据时,会自动加上mdl的读锁,是为了防止当前线程在对表进行增删改查数据时,另一个线程对表结构进行修改,导致当前线程的结果跟表结构对不上。 在修改表结构时,会自动加上mdl的写锁,其他线程不能对表做任何操作,包括对表数据的读写也不行。
当出现死锁以后,有两种策略: 一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。 另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。 前者默认超时时间是50秒,如果设置太长影响业务,如果设置太短,会造成误伤,所以一般都是用后者这个策略
行锁锁的是索引,假如where条件中没有索引的话,那么就会在主键索引中挨个查询数据,进行上锁,将会把整张表锁起来,,如果where后面加上limit 1的话,锁的将是从第一行开始到第一条符合条件的行
在go编程中要谨慎使用指针进行返回参数,原因:一般如果某个变量是指针类型,它会先被分配到当前goroutine的当前func栈上,但如果这个变量被返回了,在其他变量中也用到了这个变量,编译器会把它从栈上copy出来放到堆上,因为这个变量并没有随着func的结束,而消失。在堆上进行内存分配的开销是很大的。gc的回收周期是随着堆的使用比例进行增长的,这会让cpu在gc上耗费更多的性能和时间。但指针并不是一无是处,假如变量的内容占用内存非常大,更应该使用指针进行返回参数,这需要对当前代码进行基准测试,用来抉择。没必要进行过早的优化去都用指针
本文为wxz原创文章,转载无需和我联系,但请注明来自wxz博客https://xingzhen.wang
最新评论