索引是什么?
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构
结构:
索引很占内存,通常都是存储在磁盘中,每次使用时先从磁盘中加载到内存。每次操作新系统内存与磁盘的交换单位是以页为单位。每页大小为4kb
一、二叉树有什么缺点
根节点的左边都是比根节点的小,比根节点数据大的放右边
极端情况下,会形成线性链表,搜索深度会加大,io次数增加。
二、平衡二叉树
所有的节点左右高度差不能超过1(利用树的旋转保证)
缺陷:
搜索效率不足:在数据结构中,数据所处的深度决定着它被搜索时io的次数
节点数据内容太少:每一个磁盘块(节点/页)保存的关键字数据量太小
没有很好的利用磁盘io的预读能力
三、多路平衡二叉树(B树)
所有的子节点在同一水平线上(会进行列的合并或分裂)
四、加强版多路平衡二叉树(B+树)
五、B+树与B树的区别
为什么选用B+树
mysql中B+树索引体现形式---Myisam
(两个文件,索引文件MYI,数据文件:MYD)
mysql中B+树索引体现形式---Innodb
(一个文件,索引与数据放在一起,IBD文件),主键索引即聚集索引(无主键时会默认有个6byte的rowId)
InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小:
mysql> show variables like 'innodb_page_size';
而系统一个磁盘块的存储空间往往没有这么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16KB。InnoDB在把磁盘数据读入到磁盘时会以页为基本单位
辅助索引的数据区存储的是主键索引的关键字
六、InnoDB索引和MyISAM索引的区别:
一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。
InnoDB的主索引文件上,直接存放该行数据,称为聚簇索引。次索引指向对主键的引用。
Myisam中,主索引和次索引都指向物理行。
补充:索引覆盖
索引覆盖是指如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据。这种查询速度非常快,称为“索引覆盖”。
索引几大原则
1、列的离散性:count(distinct(col)):count(col),离散性越高,选择性越好
2、最左匹配原则:从左往右依次比较,不可跳过
联合索引(a,b,c)
为什么 b<10 and c <10,没有用到索引?而 a<10 and c <10用到了?
当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。