一 索引
1.索引的优缺点
Mysql索引有优点也有缺点,优点就是大大加快了查询速度,唯一索引也保证每一行的唯一性,加速表连接时间,
缺点就是创建维护索引需要时间,也要占用磁盘空间。更新表的时候,索引要一并更新。
2.索引的数据结构
1 哈希索引,利于等值查询
2 有序数组索引,利于范围查询
3 搜索树索引,尤其是B+树这种多路搜索树,是Mysql索引的数据结构,在二节中详细论述。
3 索引的种类
1 聚簇索引(主键索引),→mysql中innodb使用
2 非聚簇索引(二级索引),→mysql中MyISAM使用
3 覆盖索引
4 如何创建Mysql索引
create index 索引名 on 表名(列名) --普通索引
create unique index 索引名 on 表名(列名) --唯一性索引
二 Mysql索引的数据结构
1 二叉搜索树
二叉搜索树等同于二叉查找树,又叫二叉排序树,在二叉树的基础上,
二叉搜索树中左子树上所有结点的值小于它根节点的值,右子树上所有结点的值大于它结点的值。
平衡二叉树是平衡二叉搜索树的简称,每一个结点的左子树的高度和右子树的高度差最多为1.
平衡二叉树的出现是为了解决二叉查找树退化成链表的问题,当插入的结点数值从小到大时,二叉树就会退 化成链表。
2 B树和B+树
B树不是二叉树,因为B树的结点可以有两个以上的子结点,通常用于数据库和文件系统,现实中MongoDB索引的数据结构用的就是B树
B树的特点:比如m阶B树,这里B树的阶指的是B树中结点的子结点树木的最大值
①每个结点最多只有m个结点,
②每个非叶子结点具有至少m/2(向上取整)子结点。除了根结点
③如果根不是叶结点,则根至少有两个子结点
④具有K个子结点的非叶结点包含K-1个键
⑤自平衡的特性,导致所有叶子都出现在统一高度。
例:下列树为4阶B树:
B+树是B树的变形,B+树的特点:
①有k个子树的非叶子结点包含有k个键,B树是k-1个。
②B+树的所有数据都放在叶子结点中,非叶子结点只用来存索引
③B+树的叶子结点本身依关键字大小自小而大的顺序连接,而且每个叶子结点里存了非叶子结点的指针
例如:
B+树比B树好在哪里?
1.B+树的磁盘IO次数更少,效率更高,因为B+树的非叶子结点没有指向关键字具体信息的指针,所以更小,那么磁盘块中容纳的关键字数量就越多,一次性读入到内存中的就越多,IO次数就变少了。
2.B+树更稳定,因为B+树中所有叶子结点里关键字的查找需要走一条从根到叶子的路径,这样的路径是一样长的,每一个关键字的查询效率相当。但是B树更快,因为它每个结点中都有具体的关键字信息。
3.B+树更方便范围查询,而范围查询是数据库中最常用的查询功能。这利用了B+树的所有关键字信息都在叶子结点的特征,而且所有叶子结点由左至右是按顺序的。所以也说明了数据表在设计的时候一般采用主键自增的方式。
补充
1.mysql中关键字的执行顺序
答:from→on→join→where→group by→having→select→distinct→order by.
3.聚簇索引(主键索引)和非聚簇索引(二级索引)的区别:
答:聚集索引是把索引和数据放在一起,一般要两次查找,;非聚集索引是把索引和数据分开,叶子节点不存放数据,只存放数据对应的地址,不用两次查找但是就是因为把索引和数据分开,导致每次读入索引时,还要重新读数据,索引仍然不快,不适合范围查询
。
2.使用select 列名而不是使用select * 的原因
答:在innodb中使用了聚簇索引,当查询列是索引列时,为了防止回表耽误时间,所以不要用select *