MySQL高级之索引(超详细!!!)

本文详细介绍了MySQL索引的概念,探讨了为何需要索引,重点讲解了哈希表和B+树两种索引数据结构及其优缺点。文章还深入讨论了B+树在解决数据查询效率问题上的优势,并分析了聚簇索引和非聚簇索引的区别。此外,提到了回表、覆盖索引、最左匹配和索引下推等优化策略,旨在帮助读者更好地理解和利用索引提升数据库性能。
摘要由CSDN通过智能技术生成

一、什么是索引?

索引就好比字典的目录一样
我们通常都会先去目录查找关键偏旁或者字母再去查找
要比直接翻查字典查询要快很多
在这里插入图片描述

二、为什么要有索引?

然而我们在使用mysql数据库的时候也像字典一样有索引的情况下去查询,肯定速度要快很多

2.1问题:

1.mysql数据存储在什么地方?

磁盘

2.查询数据慢,一般卡在哪?

IO

3.去磁盘读取数据,是用多少读取多少吗?

磁盘预读

局部性原理:数据和程序都有聚集成群的倾向,同时之前被访问过的数据很可能再次被查询,空间局部性,时间局部性

磁盘预读:内存和磁盘发生数据交互的时候,一般情况下有一个最小的逻辑单元,页。 页一般由操作系统觉得大小,4k或8k,而我们在进行数据交互的时候,可以取页的整数倍来读取

innodb存储引擎每次读取数据,读取16k

4.索引存储在哪?

磁盘,查询数据的时候会优先将索引加载到内存中

5.索引在存储的时候,需要什么信息?需要存储存储什么字段值?

key:实际数据行中存储的值

文件地址

offset:偏移量

6.这种格式的数据要使用什么样的数据结构来进行存储?

key-values

哈希表,树(二叉树、红黑树、AVL树、B树、B+树)

7.mysql索引系统中不是按照刚刚说的格式存储的,为什么?

OLAP:联机分析处理----对海量历史数据进行分析,产生决策性的策略----数据仓库—Hive

OLTP:联机事务处理----要求很短时效内返回对应的结果----数据库—关系型数据库(mysql、oracle)

三、mysql的索引数据结构

3.1哈希表:

在这里插入图片描述
HashMap数组加链表的结构,不适合作为索引的原因:

1.哈希冲突会造成数据散列不均匀,会产生大量的线性查询,比较浪费时间

2.不支持范围查询,当进行范围查询的时候,必须挨个遍历

3.对于内存空间的要求比较高


优点: 如果是等值查询,非常快


在mysql中有没有hash索引?

1.memory存储引擎使用的是hash索引

2.innodb支持自适应hash

create table test(id int primary key,name varchar(30))
engine='innodb/memory/myisam'
-- 5.1之后默认innodb

3.2树:

树这种数据结构有很多,我们常见的有:
二叉树、BST、AVL、红黑树、B树、B+树

①二叉树:无序插入
在这里插入图片描述
这就是我们的树的结构图,但是二叉树的数据插入是无序的,也就是说当需要查找的时候,还是得一个一个挨着去遍历查找

②BST(二叉搜索树):
插入的数据有序,左子树必须小于根节点,右子树必须大于根节点--------使用二分查找来提高效率
在这里插入图片描述
这样的话如果要查询数据,可以通过二分查找,快速缩小范围,减少了时间复杂度
但是如果插入的顺序是升序或者降序的话,树的形状会变成如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值