执行计划
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层。