IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 数据库之索引 -> 正文阅读

[大数据]数据库之索引

1.什么是索引?

1.索引是一种特殊的文件,索引中包含了表数据的记录指针,索引通俗的理解,它就是书的目录,通过这个目录我们可以快速的找到我们的内容(通过索引可以快速查找数据)。

2.说以下MySQL的数据库引擎?MySQL常见的引擎都有哪些?
答:MySQL最著名的数据库引擎有两个:InnoDB和MyISAM,MyISAM是MySQL5.5之前默认的引擎,MySQL5.5之后的默认引擎是InnoDB,两个的区别是:
(1)稳定性:InnoDB引擎支持事务(保证数据的稳定性),稳定性比MyISAM好,MyISAM不支持事务。
(2)性能:MyISAM性能比较高,而InnoDB性能是不如MyISAM.

3.我们学习的知识都是基于MySQL 5.5之后数据库引擎InnoDB引擎的。
4.可以使用以下命令查询当前的数据库引擎:

show variable like 'default_storage_engine';

在这里插入图片描述
在这里插入图片描述

2.为什么需要索引?

1.存储数据模组:
(1)磁盘:容量大,价格低廉,操作速度慢,可以持久化(重启之后数据还是存在的)。
(2)内存:容量小,价格比较贵,操作速度快,不可持久化。
(3)cpu缓存:容量小,操作速度极快,不可以被持久化。
2.数据库中数据存储在磁盘,磁盘的顺序查询速度是很慢的,所以顺序查找指的是读取磁盘中的数据一条一条的进行查找。
查询数据存储的目录:

 show variables like '%dir%';

3.为什么使用索引?
使用索引可以大大的提高查询的效率
(1)使用索引可以避免顺序查询,可以直接将查询的地址定位出来,这样的话查询效率能大大的提升。
(2)使用索引可以将数据库中的关键索引信息存储在内存中,而内存的操作速度远比磁盘快。
4.索引 VS 书的目录
(1)从宏观角度来看,可以认为索引就是书的目录。
(2)从微观上来讲,索引并不等于树的目录,因为一本书的目录只有一个,而一张表可以有很多个索引,而每个索引都相当于一个目录。

3.索引的作用

1.数据库中的表、数据、索引之间的关系,类似于书架上的图书,书籍内容和书籍目录的关系。
2.索引所起的作用类似书籍目录,可用于快速定位、检测数据。
3.索引对于提高数据库的性能有很大帮助。
在这里插入图片描述

4.索引优缺点和使用场景

4.1索引优点

1.可以加速查询效率。
2.减少主从复制从库的延迟时间。

4.2索引缺点

1.索引增加了维护成本,因为索引使用的是B+树,在数据添加和删除数据时需要整理树结构,这样的话就带来了新的开销。
2.使用索引会增加存储成本(磁盘空间成本的提升,内存空间成本的提升)。
3.如果索引过多会对MySQL优化器造成一定的负担。

4.3使用场景

4.3.1创建索引要考虑的因素

1.数据量是否足够大,查询速度是否比较慢。
2.创建索引的列是否经常使用查询条件。

4.3.2不适合创建索引的场景

1.查询比较低频,而添加和删除比较高频的表业务,不适合使用索引,比如日志表(一年半载查询不了一次,但是添加非常高频,而每次添加都需要重新整理索引)
2.MySQL服务器本身安装的电脑上磁盘空间或内存严重不足的情况下,就不要创建。

4.3.3索引使用的注意事项

如果对以及存在的很多数据的表新增索引的时候,要注意不要在生产环境上执行(找一个没有用户使用的时间段进行索引创建),因为索引创建会锁表,其他的业务场景就只能排队等待了。

5.索引的使用

5.1索引的分类

1。按照是否为主键:
(1)主键索引(聚簇索引/聚集索引)
(2)非主键索引(非聚簇索引/非聚集索引/二级索引)
2.按照特征分类
(1)普通索引
(2)唯一索引(创建索引的这个字段,能保证唯一性)
(3)联合索引(就是由一个表中的多个字段组成的索引)
创建主键约束、唯一约束、外键约束时会自动创建对应列的索引。

5.2查看索引

1.语法:

show index from 表名;

2.查询学生表索引:
在这里插入图片描述

5.3创建索引

1.主键索引、唯一索引它是在创建表的时候,如果设置了主键约束或者是唯一约束的时候就会自动的创建主键索引和唯一索引。
(1)如果一个表在创建的时候设置了primary key(设置了主键约束),那么此列会自动添加一个主键索引。
(2)如果在创建一个表的时候设置了unique(唯一约束),那么此列会自动创建一个唯一索引。
(3)如果创建外键约束也会产生索引。

5.3.1创建普通索引

1.语法:

create index 索引名 on 表名 (字段名);

在这里插入图片描述

5.3.2创建唯一索引

1.语法:

create unique index 索引名 on 表名(字段名);

在这里插入图片描述

5.3.3创建主键索引

1.语法:

alter table table_name add primary key (column);

在这里插入图片描述

5.4索引 VS 约束

1.创建索引的时候会自动创建约束,并且在创建约束的时候也会自动创建索引。
2.索引和约束是不同的业务定义,约束是用来规范数据的正确性,而索引是用来提升数据库的程序性能的。

5.6删除索引

1.语法;

show index 索引名 on 表名;

每个索引名在一张表中是唯一的,不能重复。
在这里插入图片描述

5.7索引的注意事项

1.在创建索引的时候会创建对应的约束,而删除索引的时候也会删除对应的约束。
2.唯一索引在创建时,要确保原先的数据符合唯一约束,这样才能成功的创建唯一约束,否则会创建失败。
在这里插入图片描述

6.索引实现原理

1.二叉树
缺陷:数据大之后树很高,维护和查询的性能不好。
在这里插入图片描述

2.B树
缺陷:将所有数据都存储在叶子节点和非叶子节点,当数据量特别大的时候,刚把索引加载出来就需要花费很长的时间。
在这里插入图片描述
3.B+树
对上面的优化:
(1)非叶子节点不再存储表数据。
(2)叶子节点存储的并不是数据本身,而是数据的地址。
在这里插入图片描述

7.聚簇索引和非聚簇索引的区别

1.建表语句:
在这里插入图片描述
2.每个索引都会对应一颗B+树。
表中 R1~R5 的 (ID,k) 值分别为 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6),两棵树的示例示 意图如下:

在这里插入图片描述
从上面的图我们可以看出,聚簇索引叶子结点存储的是表的行数据,所以可以直接返回结果;而非聚簇索引叶子节点存储的是主键Id,需要使用主键id再去聚簇索引中获取表的相关信息,所以执行效率没有聚簇索引高,而这个查询过程就叫做回表查询。
在这里插入图片描述
3.聚簇索引 VS 非聚簇索引
(1)执行效率:聚簇索引的查询效率更快,而二级索引需要进行“回表查询”,因此它的查询效率更快。
(2)数量上:聚簇索引一个表只能有一个,而非聚簇索引可以有多个。

8.索引检验

1.索引检验:确认创建的索引是否生效
在这里插入图片描述
在这里插入图片描述

如果key为NULL表示没有索引或者索引无效;如果有值,那这个值就是执行真正的索引,如果有值表示此索引是有效。
2.建表的时候创建索引:
在这里插入图片描述

9.索引失效的场景

9.1联合索引不满足最左匹配原则

1.最左匹配原则:
在联合索引查询之中,查询语句必须要以联合索引最左边的字段开始查询,那么联合索引才能生效,否则联合索引将不会生效。
2.联合索引的顺序:sn+name+age
(A:sn,B:name,C:age)
3.不同联合查询情况:
(1)A+B+C,满足最左匹配原则,可以使用联合索引
在这里插入图片描述
(2)A+B,符合最左匹配原则,可以使用联合索引
在这里插入图片描述
(3)A+C,符合最左匹配原则,触发联合索引
在这里插入图片描述
(4)A,符合最左匹配原则,可以触发联合索引
在这里插入图片描述
(5)B+C,不符合最左匹配原则,不能使用联合索引
在这里插入图片描述
(6)B查询,C查询不符合最左匹配原则,不能使用联合索引
在这里插入图片描述
4.总结:
(1)满足最左匹配原则:
A+B+C,A+B,A+C,A,B+A,C+A,A+C+B
(2)不满足最左匹配原则的:
B+C,B,C,C+B

9.2使用错误的模糊匹配

1.like模糊查询的常用方式:
(1)前面确定->字段名 like’张%’
可以触发索引:
在这里插入图片描述
(2)后面确定->字段名like’%张’
(3)中间确定->字段名like’%张%’
上面两个都不能触发索引:
在这里插入图片描述

9.3索引查询列使用运算操作(±*/)

索引查询使用运算操作会使索引失效:
在这里插入图片描述

9.4查询的列使用了函数

在这里插入图片描述

9.5查询的列使用了隐式的类型转换

在这里插入图片描述

9.6查询列使用is not null

在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:36:19  更:2022-03-12 17:40:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:53:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码