索引是什么?
索引的概念:索引是⼀种特殊的⽂件(InnoDB数据表上的索引是表空间的⼀个组成部分),它们包含
着对数据表⾥所有记录的引⽤指针。更通俗的说,数据库索引好⽐是⼀本书前⾯的⽬录,能
加快数据库的查询速度
索引的作用:索引的⽬的在于提⾼查询效率,使原始的随机全表扫描变成快速顺序锁定数据
索引高性能的保证:把查询过程中的随机事件变成顺序事件
磁盘的IO与预读:考虑到磁盘IO是⾮常⾼昂的操作,计算机操作系统做了⼀些优化,当⼀次
IO时,不光把当前磁盘地址的数据,⽽是把相邻的数据也都读取到内存缓冲区内,因为局部
预读性原理告诉我们,当计算机访问⼀个地址的数据的时候,与其相邻的数据也会很快被访
问到。每⼀次IO读取的数据我们称之为⼀⻚(page)。具体⼀⻚有多⼤数据跟操作系统有关,
⼀般为4k或8k
索引底层实现原理
索引的目的:提⾼查询效率,可以类⽐字典,如果要查“mysql” 这个单词,我们肯定需要定位到m
字⺟,然后从下往下找到y字⺟,再找到剩下的sql
索引的设计难度:
、
<
、
between
、
in)
、模糊查询(like)
、并集查询
(or)
索引的数据结构
每个节点都是⼀个⼆元数组
: [key, data]
,所有节点都
可以存储数据。
key
为索引
的缺点:插⼊删除新的数据记录会破坏
B-Tree
的性质,因此在插⼊删除时,需要对树进⾏⼀
性质。造成
IO
操作频繁。区间查找可能需要返回上
操作繁琐
的改进:⾮叶⼦节点不存储
data
,只存储索引
key
;只有叶⼦节点才存储data
B+TREE高性能保证:3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,
性能提⾼将是巨⼤的,如果没有索引,每个数据 项都要发⽣⼀次IO,那么总共需要百万次的
IO,显然成本⾮常⾮常⾼
的每个叶⼦节点增加⼀个指向相邻叶⼦节点的指针,就形成了带有顺序访问指针的
&
所有叶⼦结点包含⼀个链指针 &
其他内层⾮叶⼦节点只存
索引检索过程
,
找到根节点
Page No,
根节点读到内存,
逐层向下查找
,
读取叶
通过 ⼆分查找找到记录或未命中。(select * from user_info where id = 23
) 查
插⼊、修改⼀般在
50ms~100ms
,
确定索引定位条件
id=18,
找到满⾜条件第⼀个叶节点, 顺序扫
直到终⽌条件满⾜
id >=21
(
select * from user_info where id >= 16 and id <
主键索引:是一种聚簇索引,数据和索引保存在一起 。通过索引可以直接找到数据,效率高
非主键索引:通过索引找到id,再根据id查询数据。
唯⼀索引和普通索引的区别
UNIQUE
索引可以强制执⾏值唯⼀的⼀列或多列。⼀个表可以有多个UNIQUE
索引。
123@q q.com
数据库层⾯的严格唯⼀
后,需查找下个记录,直到碰到第⼀个不
采⽤
page
⻚(⼀⻚
16K
)为数据单位从磁盘load出数据,
的记录在⼀⻚的最后⼀条数据,否则执⾏性能区别微乎其微
的定义:⼀种特殊的数据结构,该结构在 次要索引
中记录对
⻚
的更改
,由
“
插⼊缓
,
“
删除缓冲区”和 “清除缓冲区
”
组成
合并
)
中。在系统⼤部分处于空闲状态或 缓慢关机期
,语句执⾏结束
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/1273.html