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…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
