ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【数据库】索引

【数据库】索引 第七章 数据库索引文章目录第七章 数据库索引前言一、B树与B树二、页三、索引分类1.主键索引2.普通索引3.唯一索引4.全文索引5.聚集索引6.非聚集索引7.索引覆盖四、创建普通索引五、查看索引六、删除索引七、提问总结前言索引相当于是个目录 , 加快查询数据代价 : 消耗额外存储空间 , 引入索引可能会拖慢增删改的速度但通常认为利大于弊一、B树与B树适合索引的数据结构 : B树 , 索引专属数据结构B树(N叉搜索树) , 有地方会写作B-树 , 中间是连字符 , 不是减号 , 还是叫B树B树有N个数 , 会划分出N1个空间 , 默认不会有比最后一个数字更大的了~B树有N个数 , 会划分出N个空间 , 同样默认不会有比最后一个数更大的数字了~并且会通过“双向链表”把叶子节点串起来特点:B树也是一个N叉搜索树每个节点上有N个值,划分出N个区间(不是N1个)期中最后一个元素表示当前子树的最大值(也可以约定第一个元素是最小值)每个子节点中也可以包含N个值同时会把父节点中对应最大值放过来最终效果,叶子节点,就是完整的数据集合~叶子节点通过双向链表连接起来N叉树 , 高度更低(和红黑树比较)B树相比于B树的优势:叶子节点是数据全集并且用链表连接,非常方便可进行范围查询所有的数据都是在叶子上使得叶子节点可以存储完整的数据行非叶子节点只需要存储索引key值即可~ 此时意味着非叶子节点占用空间较小更适合在内存中缓存每次查询都是需要查询到叶子才能够完成查询的 , 中间经历的过程是差不多开销比较次数是相当的)查询的开销比较稳定~~虽然B树有时候会快一点 , 但我们更重视稳定性 !二、页页就是B树上面的节点 , 分为 :数据页 : 叶子节点存储若干个数据行索引页 :非叶子节点只需要存储key /子节点的位置数据库每次从硬盘上读取的时候以页为单位进行读取的~页这样的结构(一个页中保存多组数据)贴合局部性原理局部性原理 : 某个程序使用了某个位置的数据大概率程序接下来还会继续使用这个位置附近位置的其他数据三、索引分类1.主键索引• 当在⼀个表上定义一个主键 primary key时InnoDB使用它作为聚集索引。• 推荐为每个表定义一个主键。如逻辑上没有唯一且非空的列或列集可以使用主键则添加 一个自增列。2.普通索引• 最基本的索引类型没有唯一性的限制。• 可能为多列创建组合索引称为复合索引或组全索引3.唯一索引• 当在一个表上定义一个唯一键 unique 时自动创建唯一索引。• 与普通索引类似但区别在于唯一索引的列不允许有重复值。4.全文索引• 基于文本列(char、varchar 或 text列)上创建以加快对这些列中包含的数据查询和DML操作• 用于全文搜索仅MyISAM和InnoDB引擎支持。5.聚集索引• 与主键索引是同义词• 如果没有为表定义 primary key, InnoDB使用第一个 unique 和 not null 的列作为聚集索引• 如果表中没有 primary key 或合适的 unique 索引InnoDB会为新插入的行生成一个行号并用6字节的 ROW_ID 字段记录 ROW_ID 单调递增并使用 ROW_ID 做为索引。(ROW_ID是数据库控制 , 我们无法干预)6.非聚集索引• 聚集索引以外的索引称为非聚集索引或二级索引• 二级索引中的每条记录都包含该行的主键列以及二级索引指定的列。• InnoDB使用这个主键值来搜索聚集索引中的行这个过程称为回表查询问 : 非聚簇索引非叶子节点存放什么 ?答 : 叶子节点存储索引列的值 主键id , 因此查询到的时候不是直接查到对应的数据行 , 而是对应的主键id , 然后再去主键索引中找到对应的数据行 , 这一过程叫回表7.索引覆盖• 当⼀个select语句使用了普通索引且查询列表中的列刚好是创建普通索引时的所有或部分列这时就可以直接返回数据而不用回表查询这样的现象称为索引覆盖举例 : 要查询id 和name , 二级索存 name 主键索引 id , where条件用了name , 则不需要回表了四、创建普通索引针对空表/小表创建索引都没啥问题.但如果是一个大表(表里已经有千万级别的数据了)再去创建索引这就成了危险操作!!!create index 索引名 on 表名(列名) ;注意 :select * from class where id14 or id15;像上述语句 , 查询时查询条件中使用索引列作为条件索引才会生效select * from class where classid6 ;而这样仍以遍历全表的方式进行查询五、查看索引show index from 表名;六、删除索引删除主键索引alter table 表名 drop primary key ;删除其他索引alter table 表名 drop index 索引名 ;七、提问计算三层树⾼的B树可以存放多少条记录?总结此处省略八百字~~~
返回列表