推荐个好看的网站,西安做网站公司玖佰网络,崆峒区建设局网站,中国那个公司的网站做的最好看索引是为了提高数据查询的效率#xff0c;类似于书的目录。
索引的常见模型有三种#xff1a;
1.哈希表#xff1a;
只适用于等值查询#xff0c;不适用于范围查询
为什么呢#xff1f;
哈希表是#xff08;key#xff0c;value#xff09;的格式存储#xff0c;…索引是为了提高数据查询的效率类似于书的目录。
索引的常见模型有三种
1.哈希表
只适用于等值查询不适用于范围查询
为什么呢
哈希表是keyvalue的格式存储存储的数据不一定是按照顺序存的
比如user有idnameaddress三个属性用id%5作为哈希函数
现在存入32147几个id如果我们要找id2的user2%52很容易发现他在哈希表的第二个位置但是id2的不一定就存在第二个位置以后比如id66%51
那么如果位置冲突怎么办
上面已经存入了id2的user现在要存入id7的user7%52也要存在第二个位置
使用拉链法解决
2.有序数组
更新慢查询快查询的时间复杂度是logn
但是如果更新必须要移动更新位置之后的元素
所以有序数组适用于静态的数据库或者更新很少的数据库。
比如2015年的人口信息数据不会再改变
3.二叉搜索树
更新查询的时间复杂度都是logn
一般不推荐使用二叉树
比如一棵 100 万节点的平衡二叉树树高 20。一次查询可能需要访问 20 个数据块。在机械硬盘时代从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说对于一个 100 万行的表如果使用二叉树来存储单独访问一个行可能需要 20 个 10 ms 的时间这个查询可真够慢的。为了让一个查询尽量少地读磁盘就必须让查询过程访问尽量少的数据块。那么我们就不应该使用二叉树而是要使用“N 叉”树。这里“N 叉”树中的“N”取决于数据块的大小。以 InnoDB 的一个整数字段索引为例这个 N 差不多是 1200。这棵树高是 4 的时候就可以存 1200 的 3 次方个值这已经 17 亿了。考虑到树根的数据块总是在内存中的一个 10 亿行的表上一个整数字段的索引查找一个值最多只需要访问 3 次磁盘。其实树的第二层也有很大概率在内存中那么访问磁盘的平均次数就更少了。
N叉树中右边的兄弟比左边的兄弟值大
InnoDB的索引模型
每一个索引在 InnoDB 里面对应一棵 B 树。
索引类型分为主键索引和非主键索引。主键索引的叶子节点存的是整行数据。在 InnoDB 里主键索引也被称为聚簇索clustered index。非主键索引的叶子节点内容是主键的值。在 InnoDB 里非主键索引也被称为二级索引secondary index。
主键索引和普通索引有什么区别
主键索引select * from user where id 10,只用搜索id这颗二叉树
普通索引select * from user where name张三先搜索name这颗二叉树中名字是张三的再通过name这棵树获取到张三的id去搜id这颗二叉树再获取到全部信息。
去搜id这颗二叉树的操作叫做回写
索引维护b树的合并拆裂
索引什么时候使用自增主键什么时候用自己的属性
自增主键的插入数据模式正符合了我们前面提到的递增插入的场景。每次插入一条新记录都是追加操作都不涉及到挪动其他记录也不会触发叶子节点的分裂。而有业务逻辑的字段做主键则往往不容易保证有序插入这样写数据成本相对较高。 主键长度越小普通索引的叶子节点就越小普通索引占用的空间也就越小。所以从性能和存储空间方面考量自增主键往往是更合理的选择。
有没有什么场景适合用业务字段直接做主键的呢还是有的。比如有些业务的场景需求是这样的只有一个索引该索引必须是唯一索引。这就是典型的 KV 场景。由于没有其他索引所以也就不用考虑其他索引的叶子节点大小的问题。这时候我们就要优先考虑上一段提到的“尽量使用主键查询”原则直接将这个索引设置为主键可以避免每次查询需要搜索两棵树。 回到主键索引树搜索的过程我们称为回表。
那么有没有什么方法可以避免回表呢
1.覆盖索引
select id from user where name张三
这种的我们可以发现只需要查找user那么通过找name这颗二叉树获得id就行不用回写。
类似上面的过程就叫做覆盖索引
2.最左前缀联合索引的最左 N 个字段也可以是字符串索引的最左 M 个字符 3.联合索引根据创建联合索引的顺序以最左原则进行where检索比如agename以age1 或 age 1 and name‘张三’可以使用索引单以name‘张三’ 不会使用索引考虑到存储空间的问题还请根据业务需求将查找频繁的数据进行靠左创建索引。 4.索引下推like hello%’and age 10 检索MySQL5.6版本之前会对匹配的数据进行回表查询。5.6版本后会先过滤掉age10的数据再进行回表查询减少回表率提升检索速度