写一点自己对MySQL的学习笔记


前言

自己看视频学了一段时间的mysql,想做一下一部分的笔记,可能有错误,欢迎指正与分享。本人菜鸡,不喜勿喷。

一、索引

索引是一种能够提高查询效率的数据结构。

索引和实际的数据都是存储在磁盘的,在进行数据读取的时候会优先把索引加载到内存中。

1.1 索引的数据结构

1.1.1 为什么要选择B+树来作为底层的数据结构?

为什么不选用hash表呢?
hash 的基本结构

  1. 如果使用hash表的话,需要比较好的hash算法,否则会导致hash冲突,以及数据散列不均匀
  2. 当需要进行范围查找的时候需要挨个遍历,效率比较低

tips:memory 的存储引擎支持的是hash索引,innodb存储引擎支持自适应hash。
详细了解看innodb的四大特性

1.1.2 传统树的特点以及劣势

在这里插入图片描述
劣势:传统的双节点树当数据量大的时候,树会变得非常高,树深的话每一层就是一次IO。加大IO次数,降低读取效率。

1.1.3 B树与B+树

MySQL索引背后的数据结构及算法原理
B树与B+树

1.2 聚簇索引和非聚簇索引

  1. 数据和索引存储在一起的叫做聚簇索引,没有存在一起的叫非聚簇索引。
  2. innodb存储引擎在进行数据插入的时候,数据必须要和某一个索引列存储在一起,这个索引列一般是主键,如果没有主键,选择唯一键,如果没有唯一键,选择6字节的rowId来进行存储。
  3. 数据必定是和某一个索引绑定在一起的,绑定数据的索引叫聚簇索引
  4. 其他索引的叶子节点中存储的数据不再是整行的数据,而是聚簇索引的id值
    举例:
id name
主键 索引

id是聚簇索引,他存储的是整行的数据。name对应的索引的B+树上的叶子节点存储的就是id值

innodb中既有聚簇索引也有非聚簇索引,而myisam中只有非聚簇索引。

1.2.1 回表的含义

id name age
主键 普通索引 普通字段

若使用sql语句 select * from table where name = ‘zhangsan’; 会先根据name索引的B+树匹配到对应的叶子节点,查询到对应行记录的id值。再根据id值去id索引的B+树中检索整行记录,这个过程就称之为回表;

1.2.2 索引覆盖

id name age
主键 普通索引 普通字段

若使用sql语句 select id,name from table where name = ‘zhangsan’; 会先根据name索引的B+树匹配到对应的叶子节点,查询到对应行记录的id值。索引的叶子节点已经覆盖了查询的所有列,此时不需要回表,这个过程称为索引覆盖;(其实在这里可以直接讲id 和 name属性建一个复合索引)

1.2.3 索引下推

id name age
主键 普通索引 普通字段

若使用sql语句select * from table where name = ‘zhangsan’ and age=12;
没有索引下推之前:
先根据name从存储引擎中拉去数据到server层,然后在server层对age进行数据过滤
有了索引下推之后:
根据name和age两个条件来做数据筛选,将筛选之后的结果返回给server层
mysql结构图 网图侵删

1.3 对复合索引的一些思考

单值索引构建B+树很好理解
复合索引构建B+树的时候关键字是怎样生成的?
详细参考联合索引在B+Tree上的存储结构及数据查找方式

Guess you like

Origin blog.csdn.net/Wantbebetter/article/details/120449796