没有合适的资源?快使用搜索试试~ 我知道了~
1. 索引是什么? 1.1 索引图解 数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、更新数据库表中数据。 数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话,我们要从500万行数据里面检索一条数据,只能依次遍历这张表的全部数据(循环调用存储引擎的读取下一行数据的接口),直到找到这条数据。但是有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据了。 1.2 索引类型 普通索引(Normal):也叫非唯一索引,是最普通的索引没有任何的限制。 c
资源推荐
资源详情
资源评论
MySQL索引深入剖析索引深入剖析
1. 索引是什么?索引是什么?
1.1 索引图解索引图解
数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、更新数据库表中数据。
数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话,我们要从500万行数据里面检索一条数据,只能依次遍历这张表
的全部数据(循环调用存储引擎的读取下一行数据的接口),直到找到这条数据。但是有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一
种特殊的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据了。
1.2 索引类型索引类型
普通索引(Normal):也叫非唯一索引,是最普通的索引没有任何的限制。
create index index_name on table(column(length));
alter table table_name add index index_name on column(length);
--创建表的时候直接指定
CREATE TABLE table(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
唯一索引(Unique):唯一索引要求键值不能重复。另外需要注意的是,主键索引是一种特殊的唯一索引,它还多了一个限制条件,要求键值不能为空。主键
索引用primary key 创建。唯一索引的创建方式和普通索引的相似,只需加上在前面加上unique就行
全文索引(Fulltext): 针对比较大的数据,比如我们存放的是消息内容,有几KB的数据的这种情况,如果要解决like查询效率低的问题,可以创建全文索引。
只有文本类型的字段才可以创建全文索引,比如char、varchar、text。MyISAM和InnoDB支持全文索引。
2.索引存储模型推演索引存储模型推演
2.1 二叉查找树(二叉查找树(BST Binary Search Tree))
二叉查找树的左子树的所有节点都小于父节点,右子树所有的结点都大于父节点。投影到平面以后,就是一个有序的线性表。
二叉查找树既能够实现快速查找,又能够实现快速插入。
但是二叉查找树有一个问题:
就是它的查找耗时是和这棵树的深度相关的,在最坏的情况下时间复杂度会退化成O(n)。
什么情况是最坏的情况呢?
如果我们插入的数据刚好是有序的,2、6、11、13、17、22。它会变成链表(我们把这种树叫做“斜树”),这种情况下不能达到加快检索速度的目的,和顺序
查找效率是没有区别的。
造成它倾斜的原因是什么呢?
因为左右子树深度差太大,这棵树的左子树根本没有节点——也就是它不够平衡。
2.2 平衡二叉树(平衡二叉树(AVL Tree))
AVL Tree (Balanced binary search trees)
平衡二叉树的定义:任何一个父节点的左右子树深度差绝对值不能超过1。
按顺序插入1、2、3、4、5、6,一定是这样:
平衡二叉树在构建的时候,会对结点进行调整,保证平衡。
平衡的问题我们解决了,那么平衡二叉树作为索引怎么查询数据?
在平衡二叉树中,一个节点,它的大小是一个固定的单位,作为索引应该存储什么内容?
它应该存储三块的内容:
第一个是索引的键值。比如我们在id上面创建了一个索引,我在用where id=1的条件查询的时候就会找到索引里面的id的这个键值。
第二个是数据的磁盘地址,因为索引的作用就是去查找数据的存放的地址。
第三个,因为是二叉树,它必须还要有左子节点和右子节点的引用,这样我们才能找到下一个节点。比如大于26的时候,走右边,到下一个树的节点,继续判
断。
如果是这样存储数据的话,我们来看一下会有什么问题。
首先,索引的数据,是放在硬盘上的。
当我们用树的结构来存储索引的时候,因为拿到一块数据就要在Server层比较是不是需要的数据,如果不是的话就要再读一次磁盘。访问一个节点就要跟磁盘
之间发生一次IO。 InnoDB操作磁盘的最小的单位是一页(或者叫一个磁盘块),大小是16K(16384字节)。
那么,一个树的节点就是一个树的节点就是16K的大小。的大小。
如果我们一个节点只存一个键值+数据+引用,例如整形的字段,可能只用了十几个或者几十个字节,它远远达不到16K的容量,所以访问一个树节点,进行一
次IO的时候,浪费了大量的空间。
所以如果每个节点存储的数据太少,从索引中找到我们需要的数据,就要访问更多的节点,意味着跟磁盘交互次数就会过多。
每次从磁盘读取数据需要寻址时间,交互次数越多,消耗的时间就越多。
剩余7页未读,继续阅读
资源评论
weixin_38675969
- 粉丝: 2
- 资源: 957
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功