4 MySQL学习---MySQL索引( 四 )

B+树的优势:

  • 由于叶子节点上存放了所有的数据,并且有指针相连,每个叶子节点在逻辑上是相连的,所以对于范围查找比较友好 。
  • B+树的所有数据都在叶子节点上,所以B+树的查询效率稳定,一般都是查询3次 。
  • B+树有利于磁盘的IO,因为他的层高基本不会因为数据扩大而增高 。(三层树结构大概可以存放2000万数据量)
为什么说B+树比B树更适合数据库索引?(1)B+树的磁盘读写代价更低
树的内部结点并没有指向关键字具体信息的指针 。因此其内部结点相对B树更小 。如果把所有同一内部结点的关键字存放在同一磁盘块中,那么磁盘块所能容纳的关键字数量也越多 。一次性读入内存中的需要查找的关键字也就越多 。相对来说IO读写次数也就降低了 。
(2)B+树查询效率更加稳定
B树搜索在非叶子节点还是叶子节点结束都有可能,越靠近根节点,查找效率越快;而B+树无论查找的是什么数据,最终都需要从根节点一直走向叶节点,所有查找所经过的次数都是一样的,导致每一个数据的查询效率相当 。
(3)B+树便于范围查询(最重要的原因,范围查找是数据库的常态)
B树在提高了IO性能的同时并没有解决元素遍历效率低下的问题,正是为了解决这个问题,B+树应用而生 。B+树只需要去遍历叶子节点就可以实现整棵树的遍历 。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低 。
补充:B树的范围查找采用中序遍历,而B+树采用在双向链表上遍历的方式 。
索引分类可以查看官网文档,看看MySQL存储引擎支持的索引类型 。官网文档:https://dev.mysql.com/doc/refman/8.0/en/create-index.html
下图是MySQLinnoDB、MYISAM、MEMORY、RDB存储引擎对各种索引类型的支持情况 。

由于本文是基于MySQL的innoDB存储引擎,所以重点观察第一个表格 。
由于本文是基于MySQL的InnoDB存储引擎,因此重点观察第一个表格,其他的表格可以自行观看 。从表格中可以看出,InnoDB存储引擎索引只支持BTREE类型的索引,索引的类别有Primary Key,Unique,Key,FULLTEXT和SPATIAL 。
按表列属性分类,有以下几种索引类型:
普通索引(Key)作为MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值 。
唯一索引(Unique)索引列的值必须有值且不能重复,但允许空值 。语法如下:
# 随表一起建立唯一索引# 唯一索引时必须保证所有的值是唯一的(除了null),若有重复数据,会报错create table user (uid int(10) unsigned auto_increment,name varchar(50) not null,gender int(2) not null,primary key(uid),KEY(name),unique(gender));# 单独建立唯一索引Ccreate unique index idx_gender on user(gender);# 删除唯一索引drop index idx_gender on user;主键索引主键索引是唯一的,通常以表的ID设置为主键索引,一个表只能有一个主键索引,这是它跟唯一索引的区别 。语法如下:
# 随表一起建立主键索引create table user (uid int(10) unsigned auto_increment,name varchar(50) not null,gender int(2) not null,primary key(uid));create table user2 (uid int(10) unsigned,name varchar(50) not null,gender int(2) not null,primary key(uid));# 单独建立主键索引alter table user add primary key user(name);# 删除主键索引alter table user drop primary key;# 修改主键索引# 必须先删除掉(drop)原索引,再新建(add)索引全文索引(FULLTEXT)全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值 。全文索引可以在char、varchar或者text类型的列上创建 。

经验总结扩展阅读