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…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
