mysql从零开始(4)----索引/视图/范式
接上文
mysql从零开始(3)
索引
- 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
- 一张表的一个字段可以添加一个索引,也可以多个字段联合起来添加索引。
- 索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。
- 索引是需要排序的,索引存储成一个B-Tree数据结构
mysql查询方面有两种方式:全表扫描、根据索引检索
原理
- 在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是PK。另外在mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象。
- 在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
- 在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在。
在MyISAM存储引擎中,索引存储在一个.MYI文件中
在InnoDB存储引擎中索引存储在一个逻辑名称叫tablespace中
在MEMORY存储引擎当中索引被存储在内存当中
不管索引存储在哪里,索引在mysql当中都是一个B-Tree的形式存在。
创建删除查看
何时
- 数据量庞大,全表查询太费时
- 该字段经常出现在where的后面,以条件的形式存在,即该字段总是被扫描
- 该字段很少进行DML(insert delete update)操作,因为DML之后,索引需要重新维护
尽管索引可以极大提高查询的效率,我们也不应该随意添加索引,因为索引底层是B-Tree,索引过多的话会使索引维护起来的代价过大。
我们在查询的时候可以尽量通过主键字段、unique字段查询,效率较高、代价较小。
语法
# 创建索引
create index 索引名 on 表名(字段名);
# 删除索引
drop index 索引名 on 表名;
# 查看sql语句是否使用了索引检索
explain sql语句;
# 如果type类型是all,说明没有使用索引,如果是ref,说明使用了索引
索引失效
模糊查询
select * from test where name like '%T';
即使name加上了索引,也不能使用索引查找。所以在查找时应当尽量避免模糊查询的时候用%
开头。
or
使用or做条件筛选时,只有or两边的字段都有索引时才会走索引。
复合索引
使用复合索引时,要使用左侧的列来查找,索引才能生效。如
create index test_id_name on test(id,name);
# 走索引
mysql> explain select * from test where id = 1;
# 不走索引
mysql> explain select * from test where name = '1';
运算
如果在where中索引列参与了运算,索引失效。
# ref
select * from test where id = 1;
# all
select * from test where id + 1 = 1;
函数
如果在where中索引列使用了函数,索引失效
# ref
select * from test where lower(name) = 'tom';
视图view
基础知识
视图就是站在不同的角度去看待同一份数据,对视图对象的增删改查会影响到原表!(个人感觉有点像c++的引用)
创建视图的语句为:
create view 视图名 as DQL语句;
比如,
# 创建一个test表的视图
create view test_view as select * from test;
# 删除视图
drop view test_view;
对视图对象的增删改查和对原表的操作一样。
作用
视图的主要作用是简化复杂的sql语句,就像在编程时我们会将常用的功能单独拿出去写成一个函数一样,视图也是起到这样的作用。
假设有一条非常复杂的SQL语句,而这条SQL语句需要在不同的位置上反复使用,为了防止每一次使用这个sql语句的时候都需要重新编写,我们就可以将其以视图对象的形式新建,在需要编写这条SQL语句的位置直接使用视图对象,可以大大简化开发、利于维护,因为修改的时候也只需要修改一个位置就行,只需要修改视图对象所映射的SQL语句。
另外需要注意,视图不是在内存当中,视图对象也是存储在硬盘上的,不会消失。
范式
概念
数据库设计范式是数据库表的设计依据,按照范式进行设计,可以有效避免表中数据的冗余、空间浪费。数据库设计范式共有三个:
- 第一范式
- 第二范式
- 第三范式
第一范式
- 必须有主键,并且每一个字段都是原子性不可再分
个人信息 |
---|
1tom |
2jack |
上面这个表就是不满足第一范式的,他没有主键,即使将个人信息作为主键也不符合,因为个人信息可以分为身份id和姓名
第二范式
- 满足第一范式
- 所有非主键字段必须完全依赖主键,不要产生部分依赖
ID | 名字 | 朋友ID | 朋友姓名 |
---|---|---|---|
11 | tom | 21 | T |
12 | jack | 22 | J |
13 | sun | 21 | T |
11 | tom | 22 | J |
这张表就是典型的多对对关系:每个人都可能有多个朋友。
首先先修改上面这个表使其满足第一范式:ID和朋友ID联合作为主键。
但是此时仍然不满足第二范式,因为第二范式要求所有非主键字段必须完全依赖主键,在此刻名字
依赖于ID,朋友名字
依赖于朋友ID,这成为了部分依赖(复合主键时),这就需要分表。
ID(PK) | 姓名 |
---|---|
11 | tom |
12 | jack |
13 | sun |
朋友ID(PK) | 朋友姓名 |
---|---|
21 | T |
22 | J |
id(PK) | 姓名(FK) | 朋友姓名(FK) |
---|---|---|
1 | 11 | 21 |
2 | 12 | 22 |
3 | 13 | 21 |
4 | 11 | 22 |
第三范式
- 满足第二范式
- 要求所有非主键字典必须直接依赖主键,不要产生传递依赖
ID(PK) | 名字 | 老师ID | 老师姓名 |
---|---|---|---|
11 | tom | 21 | T |
12 | jack | 22 | J |
13 | sun | 23 | S |
11 | tom | 23 | S |
该表是典型的多对一的典型:一个老师可能有多个学生
该表满足第一范式:有主键
该表满足第二范式:主键不是复合主键,没有产生部分依赖。主键是单一主键
但是该表不满足第三范式:有传递依赖!因为老师姓名依赖于老师ID,老师ID依赖于ID,产生了传递依赖。应该更改为:
老师ID(PK) | 老师名字 |
---|---|
11 | T |
12 | J |
13 | S |
ID(PK) | 姓名 | 老师ID(FK) |
---|---|---|
11 | tom | 21 |
12 | jack | 22 |
13 | sun | 23 |
11 | tom | 23 |
相关文章:
mysql从零开始(4)----索引/视图/范式
接上文 mysql从零开始(3) 索引 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引,也可以多个字段联合起来添加索引。索引相当于一本书的目录,是为了缩小扫描范围…...

Flutter框架:从入门到实战,构建跨平台移动应用的全流程解析
第一章:Flutter框架介绍 Flutter框架是由Google推出的一款跨平台移动应用开发框架。相比其他跨平台框架,Flutter具有更高的性能和更好的用户体验。本章将介绍Flutter框架的概念、特点以及与其他跨平台框架的比较,以及Flutter开发环境的搭建和…...
Spring AOP+注解方式实现系统日志记录
一、前言 在上篇文章中,我们使用了AOP思想实现日志记录的功能,代码中采用了指定连接点方式(Pointcut(“execution(* com.nowcoder.community.controller..(…))”)),指定后不需要在进行任何操作就可以记录日志了&…...

OpenGL 4.0的Tessellation Shader(细分曲面着色器)
细分曲面着色器(Tessellation Shader)处于顶点着色器阶段的下一个阶段,我们可以看以下链接的OpenGL渲染流水线的图:Rendering Pipeline Overview。它是由ATI在2001年率先设计出来的。 目录 细分曲面着色器细分曲面Patch细分曲面控…...

项目经理如何及时掌控项目进度?
延迟是指超出计划的时间,而无法掌控则意味着管理者对实际情况一无所知。 为了解决这些问题,我们需要建立好的制度和沟通机制。例如使用项目管理软件来跟踪进度、定期开会并避免沟通障碍等。 管理者可以建立相关制度: 1、建立进度记录制度。…...
HTML <applet> 标签
HTML5 中不支持 <applet> 标签在 HTML 4 中用于定义嵌入式小程序(插件)。 实例 一个嵌入的 Java applet: <applet code="Bubbles.class" width="350" height="350"> Java applet that draws animated bubbles. </applet&g…...

加密与解密
加密与解密 加密方式分类 加密方式主要分为两种 一种是对称加密一种是非对称加密 对称加密 对称和非对称两种方式主要说的是加密和解密两个过程。 如果对数据用一个钥匙进行了加密,那么, 你想成功读取到这个加密了的数据的话,就必须对这…...

京东金融Android瘦身探索与实践
作者:京东科技 冯建华 一、背景 随着业务不断迭代更新,App的大小也在快速增加,2019年~2022年期间一度超过了117M,期间我们也做了部分优化如图1红色部分所示,但在做优化的同时面临着新的增量代码,包体积一直…...

open3d-ml 读取SemanticKITTI Dataset
目录 1. 下载dataset 2. 读取并做可视化 3. 源码阅读 3.1 读取点云数据-bin格式 3.2 读取标注数据-.label文件 3.3 读取配置 3.4 test 3.5 train 1. 下载dataset 以SemanticKITTI为例。下载链接:http://semantic-kitti.org/dataset.html#download 把上面三…...

6.其他函数
1.时间日期类 -- current_date() 返回当前日期 -- date_add(date, n) 返回从date开始n天之后的日期 -- date_sub(date, n) 返回从date开始n天之前的日期 -- datediff(date1, date2) 返回date1-date2的日期差 -- year(date) 返回…...

2023年宜昌市中等职业学校技能大赛 “网络搭建与应用”竞赛题-1
2023年宜昌市中等职业学校技能大赛 “网络搭建与应用”竞赛题 一、竞赛内容分布 “网络搭建及应用”竞赛共分二个部分,其中: 第一部分:企业网络搭建部署项目,占总分的比例为50%; 第二部分:企业网络服…...

Linux权限划分的原则
考察的不仅是一个具体的指令,还考察对技术层面的认知。 如果对 Linux 权限有较深的认知和理解,那么完全可以通过查资料去完成具体指令的执行。更重要的是,认知清晰的程序员可以把 Linux 权限管理的知识迁移到其他的系统设计中。 权限抽象 一…...

PhotoScan拼接无人机航拍RGB照片
目录 背景 拼接步骤 1.新建并保存项目 2.添加照片 3.对齐照片 4.添加标记(Markers) 5.添加地面控制点 6.建立批处理任务 7.使用批处理文件进行批处理 8.导出DEM 9.导出DOM 背景 本文介绍使用地面控制点(GCPs)拼接…...

【设计模式】责任链模式的介绍及其应用
责任链的介绍 责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求&a…...
一些思考关于行业,关于方向,关于人生路线
一些碎碎念 选择与视角工程与科研平台与信息敢问路在何方 选择与视角 两年前的秋招时几乎速通了出现在学校招聘会上的几乎出现的每一个offer,那也是我人生第一次收获到如此多的肯定与选择,为此我在b站上上传了一期就业解读,作为一个冷门到几…...

fbx sdk的使用介绍
我们平时需要围绕fbx写一些小工具,虽说使用ascii格式的fbx可以直接进行字符串解析,并且网上也有一些基于ascii解析的开源库,但在制作一些通用的工具时,使用fbx sdk进行编写肯定是最好的。 1.下载fbx sdk和cmake 要用cmake生成vi…...
mvvm模式
mvvm是Model-View-ViewModel的缩写,是前端的一种架构模式 M - Model,模型 对应data数据 V - View,视图 对应用户界面,DOM元素 VM - ViewModel,视图模型 对应vue实例对象,是连接model和view的桥梁 …...

Spring/SpringBoot常用注解总结
为什么要写这篇文章? 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多,我看了文章内容之后属实觉得质量有点低,并且有点会误导没有太多实际使用经验的人(这些人又占据了大多数)。所以,自…...

2023 年第八届数维杯大学生数学建模挑战赛 B 题 节能列车运行控制优化策略
在城市交通电气化进程快速推进的同时,与之相应的能耗增长和负面效应也 在迅速增加。城市轨道交通中的快速增长的能耗给城轨交通的可持续性发展带来 负担。2018 年,北京、上海、广州地铁负荷占全市总负荷的 1.5%-2.5%,成为了 城市电网的最大单体负荷[1]。…...
【Swift】 NSButton的用法和示例
NSButton是macOS开发中常用的控件,用于创建按钮。它有许多用法和需要注意的事项,下面介绍其中的一些。 1. 创建按钮:使用init(frame:)或init(title:action:)初始化按钮 let button NSButton(frame: NSRect(x: 0, y: 0, width: 100, height…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...