您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

索引11111

执行计划

explain
列含义
在这里插入图片描述
b+树

分块读取->分而治之

尽可能提高IO效率(1、减少IO量 2、减少IO次数)

操作系统

1、局部性原理

时间:之前被访问过的数据很有可能再次被访问。

空间:数据和程序都有聚集成群的倾向。

2、磁盘预读

 内存根磁盘在进行交互的时候有一个最小的逻辑单位,这个单位称之为页,或者datapage,一般是4k或者8k(分块读取),由操作系统决定,我们在进行数据读取的时候,一般会读取页得整数倍,也就是4k,8k,16k,innodb存储引擎在进行数据加载的时候读取的是16kb的数据。 

为什么采用b+树?

(需要比较好的hash算法,如果算法不好的话,会导致hash碰撞,hash冲突,导致数据散列不均匀。

当需要进行范围查找的时候需要挨个遍历,效率比较低)

「PS:memory的存储引擎支持的就是hash索引,同时注意innodb存储引擎支持自适应hash」

树:二叉树、BST、AVL、红黑树

共同特点:二叉树、BST、AVL、红黑树 有且仅有二个节点;BST、AVL、红黑树 有序;AVL、红黑树平衡。 共同劣势:当需要向这些树中插入更多的数据的时候,会导致当前树变的非常高(每一层都是一次IO)。在这里插入图片描述
在这里插入图片描述
键值,指针,数据

b树

b+树(只在叶子节点存储data)「一般情况下三-四层的b+树足以支持千万级别的数据量存储」

key要尽可能少的占用空间,(小于4使用varchar,大于4使用int)

hyperloglog

k-v数据格式

聚簇索引和非聚簇索引
1、数据跟索引存储在一起叫做聚簇索引

2、没有存储在一起的叫做非聚簇索引

innodb存储引擎在进行数据插入的时候,数据必须要跟某一个索引列存储在一起,这个索引列可以是主键,如果没有主键,选择唯一键,如果没有唯一键,选择6字节的rowid来进行存储(数据必定是跟某一个索引绑定在一起的,绑定数据的索引叫做聚簇索引)。

innodb既有聚簇索引业有非聚蔟索引

myisam只有非聚蔟索引

回表
id,name,age,gender

id主键,name普通索引

select * from table where name =‘zhangsan’

先根据nameB+树匹配到对应的叶子节点,查询到对应行记录的id值,再根据id去id的B+树中检索整行记录。这个过程就称之为回表,要尽量避免回表操作

索引覆盖
id,name,age,gender

id主键,name普通索引

select id,name from table where name =‘zhangsan’

根据name的值去B+树检索对应的记录,能获取到id的属性值,索引的叶子节点中包含了查询的所有列,此时不需要回表,这个过程叫做索引覆盖,using index 的提示信息,推荐使用,在某些场景中,可以考虑将要查询的所有列都变成组合索引,此时会使用索引覆盖,加快查询效率(空间换时间)。

最左匹配
创建索引的时候可以选择多个列来共同组成索引,此时叫做组合索引或者联合索引,要遵循最左匹配原则。

id,name,age,gender

id主键,name,age组合索引

select * from table where name =‘zhangsan’ and age =12; {走索引}

select * from table where name =‘zhangsan’; {走索引}

select * from table where age =12; {不走索引}

select * from table where age =12 and name =‘zhangsan’; {走索引}

select * from table where age >12 and name =‘zhangsan’; {走索引}

索引下推
select * from table where name =‘zhangsan’ and age =12;

没有索引下推之前:

先根据name从存储引擎中拉取数据到server层,然后再server层对age进行数据过滤;

有了索引下推之后:

根据name,age两个条件来做数据筛选,将筛选之后的结果返回给server层。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进