MySQL知识点(第一部分)
MySQL
基础:
1、SQL语句的分类:
- DDL:用于控制数据库的操作
- DML:用于控制表结构的字段,增、删、修
- DQL:用于查询语句
- DCL:用于管理数据库,用户,数据库的访问 权限。
2、MySQL的DQL语句的执行顺序:
先执行 from
where
group by
select
order by
limit
3、事务
1、事务的实现方式:
方式一:
查询当前系统是否为自动提交事务,如果是 0 是手动提交,1 是自动提交
select @@autocommit;
设置为手动提交
set @@autocommit = 0;
手动提交事务
commit;
回滚事务
rollback;
方式二:
手动开启事务,表示下面的操作要手动控制事务
start transaction;
2、事务的四大特性(ACID):
1、原子性:是最小分割的操作单元,要么全部成功,要么全部失败。
2、一致性:事务完成时,必须使所有的数据都保持一致。
3、隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
4、持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3、并发事物的问题:
1、脏读:一个事务读取到另一个事务还没有提交的数据。
2、不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同。
3、幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了一个幻影,再次查询又查
不到,因为已经解决了不可重读的问题,因此会出现幻读的问题。
4、事务的隔离级别(解决并发事务的问题):
1、Read uncommitted
:什么都不能解决。
2、Read committed
:只能解决脏读。
3、Repeatable Read(默认)
:只解决脏读、不可重复读。
4、Serializable
:所有的都能解决。
-- 查看事务的隔离级别
select @@transaction_isolation;
-- 修改事务的隔离级别
-- session 表示仅在当前窗口有效,global 表示全局有效。
set session transaction isolation level serializable;
进阶:
1、储存引擎:
1、MySQL的体系结构:
1、连接层:与客户端的链接,密码的校验等
2、服务层:所有的查询接口,优化器,部分函数的执行等
3、引擎层:可插拔式的存储引擎,不同的引擎具有不同的功能,默认InnoDB
4、存储层:磁盘文件,日志等
2、存储引擎的介绍:
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎可以被称为表类型。
-- 查看数据库所支持的存储引擎
show engines;
3、存储引擎的特点:
1、InnoDB:
-
特点
-
DML操作遵循ACID模型,支持事务。
-
支持行级锁,提高并发性。
-
支持外键约束,保证数据的完整性和正确性。
-
-
文件
- xxx.ibd :xxx 代表的是表名,innoDB 引擎的每张表都会对应这样一个表空间,存储该表的表结构、数据、索引。
- 参数:innodb_file_per_table: 表示是否开启每张表都对应一个表空间文件,默认是开启的。
-
逻辑空间结构:
表空间 —> 段 —> 区 —> 页 —> 行
2、MySAM
- 特点
- 不支持事务,不支持外键
- 支持表锁,不支持行锁
- 访问速度快
- 文件
- xxx.sdi 存储表结构信息
- xxx.MYD 存储数据
- xxx.MYI 存储索引
3、Memory(了解):
- 特点
- 内存存放
- hash索引
- 文件
- xxx.sdi 存储表结构信息
2、索引
1、索引概述:
索引是一种有序的数据结构,用于高效的获取数据。
**优点:**提高检索效率,降低IO成本。通过索引排序,降低CPU的消耗。
**缺点:**索引也会占用存储空间,并且再插入和删除数据时,需要维护索引结构。
2、索引结构:
1、B+Tree索引:最常见的索引类型,大部分引擎都支持B+树索引。
- 二叉树的缺点:顺序插入时,会形成一个链表,查询性能大大降低,大数据量的情况下,层级越深,检索速度越慢。
- 红黑树的缺点:大数据量的情况下,层级越深,检索速度越慢。
- B-Tree:不论是叶子节点还是非叶子节点,都会保存数据,导致保存大量数据时,只能增加树的高度,导致性能降低。
- MySQL的B+Tree:所有数据都出现在叶子节点,叶子节点也形成一个双向链表。
2、Hash索引:底层数据结构使用hash表实现的,只有精确匹配索引类的查询才有效,不支持范围查询,排序操作。
- 先计算每行的hash值,再根据hash的字段,通过hash算法计算在hash表中的槽位,并存储这一行所计算出来的hash值来定位。
3、R-Tree(空间索引):空间索引是MySAM引擎的一个特殊索引,只要用于地理空间数据类型,通常使用较少
4、Full-text(全文索引):是一种通过建立倒排索引,快速匹配文档的方式,雷素与ES
3、索引分类:
1、在innoDB中储存引擎中可分为两种:注意:底层结构都是B+Tree,只不过是叶子节点的数据不同
-
唯一索引(了解):不可重复
-
全文索引(了解):类似于ES的倒排索引
-
聚集索引:将数据存储与索引放到一块,索引结构的叶子节点保存行数据。必须有,而且只能有一个。
- 聚集索引的选取规则:
- 如果存在主键,主键索引就是聚集索引。
- 如果不存在主键,将使用第一个唯一索引作为聚集索引。
- 如果表中没有主键,或者没有适合的唯一索引,则innoDB会自动生成一个rowid作为隐藏的聚集索引。
- 聚集索引的选取规则:
-
二级索引:将数据与索引分开存储,索引结构的叶子节点关联的时对应的主键。可以存在多个。
-
查询流程:
由于二级索储存的是索引数据和该条数据的主键,对于非覆盖索引查询,都需要回表查询。
4、索引语法:
-- 创建索引:[唯一索引|全文索引] index 索引名 on 表名 (字段名1,字段2,...)
-- 索引表的名称一般为:idx_表明_字段名
create [UNIQUE|FULLTEXT] index index_name on table_name (index_col_name,...);
-- 查看索引
show index from table_name
-- 删除索引
drop index index_name on table_name
5、SQL性能分析
-- 查看数据库所有语句的执行频次:session表示当前会话的,global表示全局
show [session|global] status like 'Com_______';
-- 慢查日志-- 查看慢查询日志是否开启show variables like 'slow_query_log';-- 开启MySQL慢日志查询开关slow_query_log=1-- 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会被视为慢查询,记录慢查询的日志。long_query_time=2
-- profiling-- 查看当前数据库是否支持select @@have_profiling-- 是否开启select @@profiling-- 开启set profiling=1-- 查看show profiles
-- explain 查看搜索的执行情况explain select * from user;
6、索引的使用
1、最左前缀法则:
如果索引了多列,(联合索引),要遵循最左前缀法则,指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过了某一列,索引将部分失效(后面的字段索引也失效)
就是如果一个索引表关联了多个字段,那末,查询时必须包含最左边的字段时,索引才生效,否则,索引不生效。如果关联的是三个字段,如:A B C 那么,在查询时,如果where A=’‘,B= ’‘,C= ’‘ ;索引生效,如果B = ’‘,C=’‘。索引失效,如果:A=’‘,C=’‘;A索引生效,C索引失效;只与存不存在有关,跟位置无关:C B A 也走索引,而且全部生效;
2、范围查询
如果使用了> 或 < 的字段,则其后面的索引失效,但是,如果使用的是 >= 或 <= 则不失效。
3、索引运算
如果索引字段进行函数运算,则索引失效
4、字符串不加单引号
字符串不加 ‘ ’ 则索引失效
5、模糊查询
尾部模糊(后面加%)查询走索引,后面模糊(前面加%)不走索引
6、or
or连接的索引,如果前面有索引,后面没索引,那么索引失效。解决:给字段建立索引。
7、数据分布
如果Mysql判断,走全表扫描快还是走索引快,那个快用哪个。
8、SQL提示
1、use index(索引名)
:可以用哪个索引
2、ignore index(索引名)
:忽略哪个索引
3、force index(索引名)
:必须使用哪个索引
9、覆盖索引
覆盖索引就是只查询二级索引,就能查出来需要的字段,不需要回表查询
select 后不要写 * 要写需要的字段
10、前缀索引
在处理比较长的索引的时候。
语法:create index idx_xxxx on table_name(column(n))
表示我要将字符串的一部分前缀建立索引从而节省索引的空间。
通过数据的 字段不重复的记录数 / 总记录数 的值,如果越接近 1 ,就越好。
3、SQL优化
1、插入数据
- insert优化
- 批量插入
- 手动提交事务
- 主键顺序插入
- 大批量插入数据
- 使用
load
指令 - 连接服务端时,加上参数:
mysql --local-infile -u root -p
- 开启本地加载目录的开关:
set global local_infile=1
- 执行load指令,将准备好的数据加载到表结构中:
load data local infile '文件路径' into table '表名' fields terminated by ',' lines terminated by '\n'
- 使用
2、主键优化
1、数据组织方式
在innoDB引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。
2、页分裂
在主键乱序插入的情况下,由于要保证在每一页中的主键是有序的。因此,当一个主键的位置被占用时,就会开辟一块新的页,将这个中一半的数据都移动到新的页上面,然后再将当前数据插入到对应的位置,最后修改页指针,确保每一页之间也是有序的。
3、页合并
当删除一行记录时,并没有被物理的删除,只是被标记为删除,当页中删除的记录数道道MERGE_THRESHOLD(阈值默认为 50%),就会寻找最靠近的页看看是否能将两个页合并以优化空间的使用。阈值可以在创建表时指定。
4、主键的设计原则
- 尽量降低主键的长度
- 插入时,尽量使用AUTO_INCREMENT主键自增
- 避免对主键的修改
3、order by 优化
① Using filesort :通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序
② Using index :通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高。
- 尽量使用覆盖排序,也可以调整排序缓冲区,默认是(256K)
4、group by 的优化
通过建立索引,并满足最左前缀原则。
5、limit 的优化
一般通过覆盖索引 + 子查询的方式。
select * from user u,(select id from user order by id limit 2000000,10) a where u.id = a.id;
也就等于
select * from user u right join (select id from user order by id limit 2000000,10) a on a.id = u.id;
6、count 的优化
目前没有好的优化记录,但是可以自己维护总数据数。
- count(主键):直接把每一行的id取出来,返回服务层后累加。
- count(字段):会判断字段是否为空,为空则不记录数,如果用not null 约束后,则不用判断
- count(1):遍历整张表,不取值,每一行放一个 1 进去,后累加
- count(*):由于Mysql专门做了优化,因此不取值,直接按行累加(建议使用)
3、Update 语句
执行update语句时,要根据索引进行更新,否则会将行锁升级为表锁,锁住整张表,提交事务之前,其他的事务不能对这张表做修改操作。
4、视图
1、概括
视图是一种虚拟存在的表。只是保存了查询SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就是创建SQL语句上。
2、创建/修改/删除视图
-- create or replace view 视图名 as 查询语句
create or replace view test as select * from user;-- 检查选项:with [cascaded(默认),local] check option
create or replace view test as select * from user where id <= 30 with [cascaded,local] check option;
-- 当向视图中插入、更新、删除时 id > 30 的数据时,就会报错失败。
-- cascaded:由于视图可以依赖其他的视图创建,这个可以检查这个视图所依赖的视图,
-- 注意:如果创建的视图没有检查选项,那么即便是他所依赖的视图有检查选项,也不会检查,检查选项只能向上传递,不能向下传递。
-- 同时,如果上一层视图没有定义检查选项,那末也会检查(区别)-- local:表示,检查当前视图的的条件,同时也会递归去找上一层,但是,如果上一层没有定义检查选项,就不检查上一层。
-- 删除视图
drop view 视图名
3、查询/修改视图
-- 查询视图的创建语句
show create view 视图名
-- 由于试图是一张虚拟的表,也可以通过查询表的方式,查询视图
select * from 视图名 where ....-- 修改就是正常表的修改,但是,如果视图是定义的聚合函数,那末视图就不可进行插入,删除等操作。
5、存储过程
1、概括:
存储过程是事先金经过编译并储存在数据库中的一段SQL集合,调用存储存储过程可简化开发,减少数据库和应用服务器之间的传输,提高效率。简单来说:就是数据库SQL语言层面的代码封装和重用。
2、特点:
- 封装、重用。
- 可以接收参数,返回数据
- 减少网络交互,减少网络的开销
3、创建、调用存储过程:
-
创建
create procedure 储存过程名([参数列表]) begin -- SQL语句 end:
-
调用
call 名称([参数])
-
查看创建命令、删除
show procedure 储存过程名
相关文章:

MySQL知识点(第一部分)
MySQL 基础: 1、SQL语句的分类: DDL:用于控制数据库的操作DML:用于控制表结构的字段,增、删、修DQL:用于查询语句DCL:用于管理数据库,用户,数据库的访问 权限。 2、M…...

ChatGPT使用经验分享
ChatGPT 3.5模型 与 4模型的区别 ChatGPT 3.5 示例 问:树上有9只鸟,打死了一只还剩几只? 答:如果打死了一只鸟,那么树上还剩下8只鸟。 ChatGPT 4 示例 问:树上有9只鸟,打死了一只还剩几只&…...

Webshell原理与利用
本文内容仅用于技术研究、网络安全防御及合法授权的渗透测试,严禁用于任何非法入侵、破坏或未经授权的网络活动。 1. WebShell的定义与原理 定义:WebShell是一种基于Web脚本语言(如PHP、ASP、JSP)编写的恶意后门程序,…...

Java直通车系列15【Spring MVC】(ModelAndView 使用)
目录 1. ModelAndView 概述 2. ModelAndView 的主要属性和方法 主要属性 主要方法 3. 场景示例 示例 1:简单的 ModelAndView 使用 示例 2:使用 ModelAndView 处理列表数据 示例 3:使用 ModelAndView 处理异常情况 1. ModelAndView 概…...

大模型系列课程学习-基于Vllm/Ollama/Ktransformers完成Deepseek推理服务部署
1.机器配置及实验说明 基于前期搭建的双卡机器装机教程,配置如下: 硬件名称参数备注CPUE5-2680V42 *2(线程28个)无GPU2080TI-22G 双卡魔改卡系统WSL Unbuntu 22.04.5 LTS虚拟机 本轮实验目的:基于VLLM/Ollama/ktran…...

基于深度文档理解的开源 RAG 引擎RAGFlow的介绍和安装
目录 前言1. RAGFlow 简介1.1 什么是 RAGFlow?1.2 RAGFlow 的核心特点 2. RAGFlow 的安装与配置2.1 硬件与软件要求2.2 下载 RAGFlow 源码2.3 源码编译 Docker 镜像2.4 设置完整版(包含 embedding 模型)2.5 运行 RAGFlow 3. RAGFlow 的应用场…...

DNS Beaconing
“DNS Beaconing” 是一种隐蔽的网络通信技术,通常与恶意软件(如木马、僵尸网络)相关。攻击者通过定期发送 DNS请求 到受控的域名服务器(C&C服务器),实现与恶意软件的隐蔽通信、数据传输或指令下发。由…...

【论文阅读】多模态——LSeg
文献基本信息 标题:Language-Driven Semantic Segmentation作者:Boyi Li、Kilian Q. Weinberger、Serge Belongie、Vladlen Koltun、Ren Ranftl单位:Cornell University、University of Copenhagen、Apple、Intel Labs会议/期刊:…...

vue3如何配置环境和打包
很多新手友友们或刚从vue2切换到vue3的同学,对vue3不同环境配置和打包有很多困惑的地方,Jenna这就把vue3打包配置流程详细的写下来,你们只需要copy就好啦 1.创建环境文件 当我们把项目拿到手,只需要创建三个环境文件:…...

高并发下订单库存防止超卖策略
文章目录 什么是超卖问题?推荐策略:Redis原子操作(Redis incr)乐观锁lua脚本利用Redis increment 的原子操作,保证库存数安全update使用乐观锁LUA脚本保持库存原子性 什么是超卖问题? 在并发的场景下,比如商城售卖商品…...

vue安装stylelint
执行 npm install -D stylelint postcss-html stylelint-config-recommended-vue stylelint-config-standard stylelint-order stylelint-prettier postcss-less stylelint-config-property-sort-order-smacss 安装依赖,这里是less,sass换成postcss-scss…...

用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏
大家好!今天我将分享如何使用 HTML 和 JavaScript 编写一个简单的飞机游戏。这个游戏的核心功能包括:控制飞机移动、发射子弹、敌机生成、碰撞检测和得分统计。代码简洁易懂,适合初学者学习和实践。 游戏功能概述 玩家控制:使用键…...

three.js 在 webGL 添加纹理
在我们生成了3D设计之后,我们可以添加纹理使其更加吸引人。在 webGL 和 p5.js中,可以使用 gl.texImage2D() 和 texture() API来为形状应用纹理。 使用 webGL 在 webGL 中,gl.texImage2D() 函数用于从图像文件生成2D纹理。该函数接受许多参…...

【5】单调队列学习笔记
前言 鸽了很久, 2023 / 1 / 5 2023/1/5 2023/1/5 开始, 2023 / 1 / 21 2023/1/21 2023/1/21 才完工。 中途去集训了,没时间来补漏洞。 单调队列 单调队列是一种非常实用的数据结构,可以用于查询一个定长区间在以一定速度向后滑…...

deepseek为什么要开源
一、生态位的抢占与锁定:以 JDK 版本为例 在软件开发的世界里,生态位的抢占和先入为主的效应十分显著。就拿 Java 开发中的 JDK 版本来说,目前大多数开发者仍在广泛使用 JDK8。尽管 JDK17 和 JDK21 已经推出,且具备更多先进特性…...

MySQL基本建表操作
目录 1,创建数据库db_ck 1.1创建表 1.2 查看创建好的表 2,创建表t_hero 2.1 先进入数据库Db_Ck 2.1.1 这里可以看是否进入数据库: 2.2 创建表t_Hero 2.2.1 我们可以先在文本文档里面写好然后粘贴进去,因为直接写的话,错了要重新开始 …...

防火墙旁挂组网双机热备负载均衡
一,二层交换网络: 使用MSTPVRRP组网形式 VLAN 2--->SW3为主,SW4 作为备份 VLAN 3--->SW4为主,SW3 作为备份 MSTP 设计 --->SW3 、 4 、 5 运行 实例 1 : VLAN 2 实例 2 : VLAN 3 SW3 是实例 1 的主根,实…...

大白话react第十八章React 与 WebGL 项目的高级拓展与优化
大白话react第十八章React 与 WebGL 项目的高级拓展与优化 1. 实现 3D 模型的导入与动画 在之前的基础上,我们可以导入更复杂的 3D 模型,并且让这些模型动起来,就像在游戏里看到的角色和场景一样。这里我们使用 GLTF 格式的模型,…...

JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件
JavaScript 事件系统是构建交互式 Web 应用的核心。本文从原生 DOM 事件到 React 的合成事件,内容涵盖: JavaScript 事件基础:事件类型、事件注册、事件对象事件传播机制:捕获、目标和冒泡阶段高级事件技术:事件委托、…...

C++:string容器(下篇)
1.string浅拷贝的问题 // 为了和标准库区分,此处使用String class String { public :/*String():_str(new char[1]){*_str \0;}*///String(const char* str "\0") // 错误示范//String(const char* str nullptr) // 错误示范String(const char* str …...

2.数据结构-栈和队列
数据结构-栈和队列 2.1栈2.1.1栈的表示和实现2.1.2栈的应用举例数制转换括号匹配检验迷宫给求解表达式求值 2.1.3链栈的表示和实现2.1.4栈与递归的实现遍历输出链表中各个结点的递归算法*Hanoi塔问题的递归算法 2.2队列2.2.1循环队列——队列的顺序表示和实现2.2.2链队——队列…...

aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)
aws(学习笔记第三十一课) aws cdk深入学习 学习内容: 深入练习aws cdk下部署batch-arm64-instance-type 1. 深入练习aws cdk下部署batch-arm64-instance-type 代码链接 代码链接 代码链接 -> batch-arm64-instance-type之前代码学习 之前学习代码链接 -> aw…...

MySQL 中,SELECT ... FOR UPDATE
在 MySQL 中,SELECT ... FOR UPDATE 语句会对查询结果集中的行加排他锁(X 锁)。关于其他事务是否能读取当前行,以下是详细说明: 1. 排他锁(X 锁)的特性 排他锁是一种独占锁,加锁后&…...

云服务运维智能时代:阿里云操作系统控制台
阿里云操作系统控制台 引言需求介绍操作系统使用实例获得的帮助与提升建议 引言 阿里云操作系统控制台是一款创新型云服务器运维工具,专为简化用户的运维工作而设计。它采用智能化和可视化的方式,让运维变得更加高效、直观。借助AI技术,控制…...

【Agent的革命之路——LangGraph】如何使用config
有时我们希望在调用代理时能够对其进行配置。这包括配置使用哪个语言模型(LLM)等例子。下面我们将通过一个示例来详细介绍如何进行这样的配置。 在介绍 configurable 之前我们先介绍一下 Langchain 的 RunnableConfig。RunnableConfig是一个配置对象&…...

ArcGIS操作:15 计算点的经纬度,并添加到属性表
注意:需要转化为地理坐标系 1、打开属性表,添加字段 2、计算字段(以计算纬度为例 !Shape!.centroid.Y ) 3、效果...

Docker基础入门
第 1 章:核心概念与安装配置 本章首先介绍Docker 的三大核心概念: 镜像 (Image)容器(Container)仓库(Repository) 只有理解了这三个核心概念,才能顺利地理解Docker容器的整个生命周期。 随后࿰…...

【Linux】详谈 基础I/O
目录 一、理解文件 狭义的理解: 广义理解: 文件操作的归类认知 系统角度 二、系统文件I/O 2.1 标志位的传递 系统级接口open 编辑 open返回值 写入文件 读文件 三、文件描述符 3.1(0 & 1 & 2) 3.2 文件描…...

爬虫案例七Python协程爬取视频
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python协程爬取视频 前言 提示:这里可以添加本文要记录的大概内容: 爬虫案例七协程爬取视频 提示:以下是本篇文章正文…...

[20250304] 关于 RISC-V芯片 的介绍
[20250304] 关于 RISC-V芯片 的介绍 1. 调研报告 一、RISC-V 芯片结构分析 RISC-V 芯片基于开源指令集架构(ISA),其核心优势在于模块化设计与高度灵活性。 指令集架构 基础指令集:包含 RV32I(32 位)、R…...