索引是的工作机制加速对数据检索的数据结构
hashtable
树形结构:二叉树,红黑树
hash 的缺点:
在等值查询,单行查询很快,但不能支持范围查询
二叉树的缺点
树的高度等于io次数,树太高,io次数太多,
页作为单位 ,io操作加载的目标的数据太少
MySQL为什么选择B+tree
BTree:多路(叉)树,是一个绝对平衡的树(不断地分裂合并),最后一个叶子都在一层
BTree的搜索过程:
若干个关键字,会把数据区划分为多个区间…,以17为例
负无穷小-17 开区间
17-35
35-正无穷大
最多关键字的个数 +1 =子节点个数
**B+Tree: 划分区间
0-17
17-35
35-正无穷大
io性能更强
排序能力强 在最后的叶子节点,会指向相邻最近的头节点
基于索引扫库扫表的能力更强
性能更加稳定 ,用户体验更好
explain 执行过程 type range
易变字段不要添加索引
一条sql语句一般只会走一个索引,处于成本计算,除了or
show variables like ‘datadir’
innodb
一张表
聚集索引:以主键的方式来组织表行数据
行数据都保存在叶子节点的数据区
为什么…辅助索引需要存主键的值,
myISAM
两张表
先从树中找到磁盘地址,user.myd
越
公式:
比值越高离散度越好
对索引中关键字的比较遵循最左比较原则
字符大小可以比较大小吗? 可以比较
为什么 like ‘%abc’ 用不到索引
联合索引 大于之后全失效
多个列组成的一个列
覆盖索引:查询的正好的是关键字
三星索引:(衡量索引的好坏的参照)
第一颗星:where后条件越多扫描的数据越少
第二颗星:避免再次排序
第三颗星:尽可能用到覆盖索引,进行数据扫描,减少回表IO操作