04 MySQL-初识MySQL-索引-上篇

2019-05-20  本文已影响0人  花神子

一 索引的常见模型

索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”

索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多。这里先介绍三种常见、也比较简单的数据结构,它们分别是哈希表有序数组搜索树

1.1 哈希表:

假设,你现在维护着一个身份证信息和姓名的表,需要根据身份证号查找对应的名字,这时对应的哈希索引的示意图如下所示:

mysql-index-Page-1.png

1.2 有序数组

有序数组在等值查询和范围查询场景中的性能就都非常优秀

还是上面这个根据身份证号查名字的例子,如果我们使用有序数组来实现的话,示意图如下所示:

mysql-index-sort-Page.png

1.3 搜索树

针对搜索树-二叉树是非常经典的数据结构了,还是上面根据身份证号查名字的例子,如果我们用二叉搜索树来实现的话,示意图如下所示:

mysql-index-tree-Page.png

二 InnoDB 的索引模型

MySQL中,索引是在存储引擎层实现的,所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样。而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。由于InnoDB存储引擎在MySQL数据库中使用最为广泛的索引模型。

举例,有一个主键列为ID的表,表中有字段k,并且在k上有索引。这个表的建表语句是:

 create table T(
id int primary key, 
k int not null, 
name varchar(16),
index (k))engine=InnoDB;
mysql-B-Page (1).png

图中显示两个索引树(表中T1~T5的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6),两棵树的示例示意图如下。),根据叶子节点的内容,索引类型分为主键索引和非主键索引。

问题基于主键索引和普通索引的查询有什么区别?
我们尝试分析下面两个语句:

 select * from T where ID=100;
 select * from T where k=1;

所以:基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

三 索引维护

B+树为了维护索引有序性,在插入新值的时候需要做必要的维护。
接着已上图为例:

场景分析:要求建表语句里一定要有自增主键

问题:什么场景使用业务字段直接作为主键?

比如:只有一个索引;该索引必须是唯一索引。其实这也是典型的[K, V]场景。因为没有其他索引,所以无须考虑二级索引的叶子(🍃)节点的大小问题。

综上:我们应优先考虑尽量使用主键索引查询原则,避免每次查询需要搜索两棵树。

问题: 上面例子中的InnoDB表T,如果你要重建索引 k,你的两个SQL语句可以这么写:

alter table T drop index k;
alter table T add index(k);

如果你要重建主键索引,也可以这么写:

alter table T drop primary key;
alter table T add primary key(id);
上一篇 下一篇

猜你喜欢

热点阅读