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…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...
