1.什么是索引?
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。(就好像我们小时候用的字典,有了字典查到对应的字就会变快)
2.为什么需要索引?
首先我们需要了解一些概念和知识
- mysql数据存储在什么地方?—-磁盘
- 查询数据比较慢的,一般情况下是卡在哪了? —-IO
- (所以我们要提高IO的效率,那么如何提高呢?—- 次数和量两个层面,例如:搬砖,搬一次和搬十次耗费的力气是不一样的,一次搬一块和一次搬十块耗费的力气(占用IO资源)也是不一样的。所以我们尽可能的在满足自身需求的前提下,减少和IO的交互)
- 去磁盘读取数据的时候,是用多少读取多少嘛? —-磁盘预读
- 磁盘预读:内存跟磁盘在发生数据交互的时候,一般情况下有一个最小的逻辑单元,称为页,datapage,页一般由操作系统决定是多大,一般是4k和8k,而我们在进行数据交互的时候,可以取页的的整数倍来进行读取,innodb存储引擎每次读取数据为16k
- 局部性原理:数据和程序都有聚集成群的倾向,同时之前被访问过的数据和可能再次被查询,涉及空间局部性、时间局部性
通过以上几个概念我们大概知道索引是用来干嘛的了—-预先设计好索引系统,等我们查询数据的时候,减少和IO的交互来提高我们的查询效率。
3.如何设计索引系统?
我们还是先明白几个概念
- 索引存储在哪?—- 本文来源gaodai#ma#com搞@@代~&码*网/磁盘,查询数据的时候会优先将索引加载到内存中
- 索引在存储的时候需要什么信息?需要存什么字段值?
—— key:实际数据行中储存的值
—— 文件地址(指针、我们需要找到存储数据文件在哪就得靠文件地址)
—— offset:偏移量(如果我们要取文件中的某一条数据时,就需要用到偏移量)
- 上面说的这种格式的数据要使用什么样的数据结构来储存?
—— 上面可知我们我们的数据格式是 K-V类型的
知道K-V格式数据那我们就知道使用什么数据结构来储存了,有哈希表、树(二叉树、二分查找树、二分平衡树、红黑树、B树、B+树)
综上所述,我们可以上面的数据结构来设计我们的索引系统
4.MYSQL索引系统是什么呢?
为什么不按照上面说的格式储存呢?