学习MYSQL

DDL 建表
DML增删改
DQL查询
DCL控制用户权限

存储引擎

MYSQL体系结构
*连接层
*服务层(DML DDL )
*引擎层(可插拔)(索引在这里,不通的引擎 索引结构不同)
*存储层,

外键:
外键关系(Foreign Key Relationship):从表的外键与主表的主键或唯一键相对应。
级联更新(Cascade Update):当主表中的主键或唯一键更新时,从表中对应的外键也会自动更新。
级联删除(Cascade Delete):当主表中的主键或唯一键删除时,从表中对应的外键也会自动删除或置为NULL。

存储引擎


基于表的(创建表的时候)
Innodb默认--5.5版本后
myISAM早期默认
Memory

Innodb

*特点
*支持DML , 事务 ,行锁 ,高并发,外键约束,保证数据完整和正确
*磁盘:每个表都有一个表空间文件(表结构 ,数据,索引)

逻辑存储结构:表--段--区(1M)--页(16K)--行

MYISAM(mongodb替代)

*不支持事务,外键,行锁
*支持表锁
*访问速度快
*磁盘有三个文件(分别存:表结构 ,数据,索引)

Memory(redis替代)

*内存存放
*hash索引(默认)
磁盘一个文件(表结构)


选择引擎  
事务-外键-完整性等  Innodb
插入-读取多,更新和删除少的 MYISAM
临时Memory

索引

*概述:是一种高速获取数据的-有序数据结构
(二叉树:
先比较 --小的往左, 大的往右)
*优点
高速获取数据,
提高排序效率  降低cpu消耗
缺点:
占用磁盘
影响增删改
 

索引结构

B+tree索引      支持所有引擎
hash索引      支持memory

Btree:中间元素向上分裂     4ket 5指针

B+tree: 
*所有的元素都会出现在叶子节点
*所有叶子都会形成一个单向链表

mysql优化后的B+tree
*增加一个指向相邻叶子节点的链表指针(双向),形成有序的指针提高访问

Hash(等值配匹-不能范围-不能排序通常一次查询 很快
*将键值换算成hash值 映射到对应的槽位上,然后存在hash表中
*hash冲突(碰撞)通过链表来解决
 

Innodb自适应hash功能,在指定环境下可以自动构建


为什么Innodb选择使用B+tree

*相对二叉树,层级更少,查询效率更高

*对于Btree,无论是叶子还是非叶子节点都存储数据,这样导致一页中存储的键值和指针减少,要保存同样的数据就加树高度,导致性能降低

*相对Hash   不能范围-不能排序



 


索引分类

主键索引,唯一索引,常规索引,全文索引(查找文中的关键字)
 

innodb索引的存储形式
1:聚集索引(必须有 且一个)(主键)
结构:(叶子节点挂的就是
row数据!!!!!!!!!!!!!!!!!!

2:二级索引 (多个)
结构:(叶子节点挂的就是
id!!!!!!!!!!!!!!!!!!

select * from aaa where  name= 666( 先二级查询找到id,再根据id聚集查询找到数据)
(回表查询)


聚集索引选取规则
*优先主键
*第一个唯一索引
*自动生成一个隐藏的


Innodb主键索引的B+tree高度为多高???!!!!!!!!!!!!!
*每个节点(包含key,指针(6字节))落在磁盘的页(16K)当中
*假设:
一行数据大小为1k ,一页可以存16行,指针占用6byte,  bigint主键(key值)占用8byte
高度为2
第一层 n*8 +(n+1)*6 =16*1024  计算n=1170   n就是ket的数量
第二层 1171*16 = 18730   一万八
如果是三层 1171*1171*16 = 2千1百万


 


SQL分析

*查询SQL执行各种操作的频率 show global status like  'Com____'
*查询慢sql日志 (默认关闭的) 打开并 设置时间
*查看sql执行各个阶段耗时   profile ,(先查看是否支持)

*执行计划explain

explain
*id 越大越优先执行,相同就从上到下执行
*
type 连接类型:null ,system ,const(主键查询),ref(一般查询) ,all
* possible_key 可能用到的索引
 *key 实际用到的索引
*key_len索引长度 越短越好
*rows查询行数
*filterd 结果和读取比例  越大100%越好   
*extra 额外信息

 

索引使用

避免回表- 避 避免回表免回表 避免回表 避免回表  避免回表  避免回表  避免回表

失效的情况

*最左前缀法则 :联合索引 最左的字段一定要存在 不然就失效,跳过的也失效
*范围查询失效:联合索引 >< 范围查询失效    , 用>= <= 解决
*不要再索引列进行sub等运算 会失效(在hwhere 里面)

*字符串不加引号 索引失效
*模块查询头不配匹就会失效
*使用or 两边都要有索引 才会生效
*MYSQL评估 走全文比索引快  就不会走索引


SQL提示(选择走哪个索引)


背景:同一个联合索引和一般索引(自动选择 不固定),可能会先走联合索引
*use index    建议使用这个索引
*ignore index  不走
*force index   必须走

例子:     select * from  table use index(id)   where id = 11


覆盖索引

(返回的数据 尽量包含索引 ,少用select* 很容易回表)
*查询返回减少无用字段 多余的字段会导致回表查询(索引信息没有包含全部数据)
ps-尽量在索引就能回去所有数据

 


前缀索引 

*对大字段部分长度做索引 减少索引体积空间
*选择长度越长越好  最好唯一

单列索引(多个,只会有快的那一个)
联合索引(存在多个查询条件 建议使用)  考虑建立索引的顺序

 


设计原则

*数据量大
*查询频繁
*针对 在 where ,order by, group by 的字段
*选择区分度高的 例如id 唯一的
*如果是大字符串的  建议前缀索引
*尽量联合索引 减少空间,减少回表,尽量覆盖索引
*控制索引的数量,会影响增删改
*索引不能为null,建表的时候 约束not null,

SQL优化

insert优化
*批量插入(最大1千)
*手动提交事务
*主键顺序插入(乱序会产生页分裂)
*load指令大大批量插入数据(百万级别)

主键优化
表数据是根据主键顺序组织存放的  称为(索引组织表
*因为innodb数据是有序的, 乱序插入会 页分裂
*数据删除只是标记,当删除默认页50%,就会页合并
1尽量减少主键长度,影响空间和查询,二级索引也存有主键
2顺序插入 现在自动增长,避免页分裂

3尽量不要用uuid 身份证 做主键 因为他们是无序的且长
4业务操作 避免对主键修改

order by 优化
排序有两种
1,Using filesort 通过索引或者全表扫描,得到数据 放到缓冲区完成排序的
2,Using index 通过索引顺序扫描直接得到有序数据,速度快(优化的目标)(覆盖索引
*创建索引默认升序
*创建联合索引
优化
1建立合适索引 遵循最左前缀法则
2尽量使用 覆盖索引
3多索引 一个升序 一个降,就注意索引创建对应的升降,
4缓冲区默认256K,大数据可以 调高一点,不然会在磁盘操作 慢

group by 优化
*通过索引操作
*最左前缀法则

Limit优化
越往后分页越慢,
*思路:通过覆盖索引,再加子查询

count()优化
*自己记录
*count(*)最快直接统计行数
count(0)填充数字统计行数 快
*count(字段) 统计非null

update优化
innodb行数锁是针对索引加的,不是子记录加,如果索引失效 会升级表锁
*一定要加索引

 

视图

*虚拟表,只保存sql逻辑  要关联基础表
创建 create view aa1 AS select id from bb 
加检查选项  
检查选项:casaded(默认)(向上找),local(递归找)
*视图也可以作为基表,检查选项继承


*可以当作一个表来使用
*视图可以更新的条件是 和基础表数据一对一

作用:
简单,:简化其他操作
安全,:数据库授权 部分字段
数据独立:屏蔽基础班结构变化带来的影响
 


存储过程
 

定义:存储在数据库的sql集合,
作用:简化开发人员工作,减少应用和客户段的交互 
特点: (封装和重用),接收参数和返回参数,减少网络传输

创建 
create procedure name {参数列表}
begin
   -----sql
end

调用   call name {参数列表}

查看:
1可以查看某个表有哪些存储过程
2查看存储过程的 语句
3工具(routine下面)

系统变量(如提交事务)(两个@@)
*全局变量:gloabl  会话变量:session
*查看show  和设置set(默认重启还原)

自定义变量(一个@) 在当前会话生效
可以直接赋值 可以查询赋值  没有赋值就是null

局部变量
*在begin 和 end 之间生效
声明declare

参数 
in 默认
out

inout

存储函数(例如 sum,1到N的累加结果)  


*封装方法()可以用存储过程代替
 


触发器 tirgger

*是和表有关的对象  在表增删改的时候触发(指定的sql集合)
*只支持行级
old new 操作前后的数据

锁 锁 锁 锁

(锁了以后 只读)

*全局锁
经典使用:全库备份
加锁---备份--解锁

*表级锁
*myIsam innodb 都支持
1表锁(读锁,写锁)  lock tble name   read/write
        读锁:阻塞两个客户端写,可读
        写锁:阻塞其他客户端的读写

2元数据锁(系统自动控制)
在表有 DML DDL操作的时候 ,自动加索避免数据冲突

3意向锁-自动
表锁前 ,先查看有没有通过意向锁检查是否存在行锁在

共享锁 IS(读), 可以兼容共享 ,其他不行
排他锁 IX(读写),都不兼容

*行级锁(加载索引)

innodb支持

RU 读未提交  ,RC读提交, RR 重复读(l临界锁) ,SE 序列化
分类:行锁, 间隙锁, 临界锁
*行锁 : RC RR级别支持(防止幻读) 例子锁5或10
有索引的时候就自动优化为行锁,不然对所有记录加锁-会升级为表锁

*间隙锁(gap):RR,例子5-10之间6789
防止其他数据加入间隙 产生幻读
*临界锁(行锁+间隙锁): RR,例子锁5678910


增删改:加的是排他锁,自动
:不加锁,,可以手动加
 

Innodb
结构
1表空间 
2段,数据段,索引段,回滚段,
3区,1M ,包含64页
4页,(innodb磁盘管理最小单位)16k
5行

内存架构:先在内存(buffer)操作 一段时间再更新到磁盘

事务原理
*原子性 undo log
*一致性    都由日志来保证(redo log + undo log)
*持久性   redo log

*隔离性:由锁+MVCC保证的
 

MVCC 多版本并发控制!!!!!!!!!!!!!!!
概念
当前读:读取最新数据,加锁 不能被其他修改
快照读:简单select 不加锁 非阻塞。(RR第一次查询是)

MVCC实现依赖
*快照读,*3个隐藏式字段,*undo log(回滚日志),readView
#3个字段
1最近修改事务的ID
2回滚指针,(配合undo log 可以找回上一个版本)
3隐藏主键(只有再没有主键的情况才会有)
#undo log(回滚日志
#readView  
*是快照读获取数据的依据



MYcat

概念:逻辑库----逻辑表-----(分片规则)---分片节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java springboot简单了解数据源实现 与 springboot内置数据源

之前 我们讲到的项目 数据库管理 用了三种技术 数据源管理方式 我们选择了: DruidDataSource 持久化技术: MyBatis-Plus / MyBatis 数据库: MySql 那么 我们在刚接触数据库连接时 是没用配置Druid的 那它有没有用数据源呢&#xff1f; 我们接触过的配置Druid的方式有两种 用…

【发布小程序配置服务器域名,不配置发布之后访问就会报错request:fail url not in domain list】

小程序在本地开发的时候大家通常会在微信开发者工具中设置“不校验合法域名、web-view (业务域名)、TLS 版本以及HTTPS证书”&#xff0c;久而久之可能会忘掉这个操作&#xff0c;然后打包直接上线发布&#xff0c;结果发现访问会报错request:fail url not in domain list&…

Chat-GPT原理

Chat-GPT原理核心:基于Transformer 架构 ​ 以下是参考文献的部分截图原文说明&#xff1a; ​ Transformers are based on the “attention mechanism,” which allows the model to pay more attention to some inputs than others, regardless of where they show up in t…

热门好用的核验类API,含免费次数

信息核验类 实人认证&#xff08;人像三要素&#xff09;&#xff1a;输入姓名、身份证号码和一张人脸照片&#xff0c;与公安库身份证头像进行权威比对&#xff0c;返回比对分值。实名认证&#xff08;身份证二要素&#xff09;&#xff1a;核验身份证二要素&#xff08;姓名…

2023年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题(三)

2023年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09; 网络安全竞赛样题&#xff08;三&#xff09; &#xff08;总分1000分&#xff09; 目录 模块A 基础设施设置与安全加固 模块B 网络安全事件响应、数字取证调查和应用安全 B-1任务一&#xff1a;主机发现…

MySQL之binlog文件过多处理方法

背景 MySQL由于大量读写&#xff0c;导致binlog文件特别的多。从而导致服务器disk空间不足问题。 先备份binlog文件 tar -zcvf mysql.tar.gz mysql/data/mysql-bin.00* 修改MySQL配置 binlog过期时间 show variables like expire_logs_days; 这里 0 表示 永不过期 如果为 n…

在2台RHEL 8服务器上安装并配置PostgreSQL 14的主从架构

为了在两台RHEL 8服务器上安装并配置PostgreSQL 14的主从架构&#xff0c;你需要按照以下步骤操作。这将包括安装PostgreSQL、初始化数据库、调整配置、设置归档目录等。请确保你具有root或具有适当权限的用户访问权限来执行这些操作。 1. 安装PostgreSQL 14 在两台服务器上都…

卡通渲染总结《一》

本文是在看完之前的综述论文《Cartoon Style Rendering》的总结&#xff0c;论文时间是2008年有点早&#xff0c;但有一定启发意义。 前言 首先卡通渲染是非真实化渲染&#xff08;NPR&#xff09;的一个部分.而NPR旨在模拟出手工插图的效果例如油画、墨水画、漫画风格作品。 …

常用类与比较器

常用类 学一个类&#xff0c;先搞清楚继承关系&#xff0c;再看源码 包装类Wrapper jdk5之前是手动装箱拆箱 jdk5及之后是自动装箱拆箱&#xff08;调用valueOf方法&#xff08;自动默认&#xff09;/创建对象的构造方法&#xff0c;XXXvalue方法…

mongdb配置ssl

mongodb5.0.9 centos7.6 x86 1、正常启动mongod -f mongodb.conf 【前言】 ssl配置流程步骤&#xff0c;按照以下顺序处理即可。 1.生成证书&#xff0c;根证书&#xff0c;服务端证书&#xff0c;客户端证书 2.配置服务端ssl配置&#xff0c;测试she…

vue form表单的封装--使用的是elementUI

该组件是一个动态生成表单的Vue组件&#xff0c;通过传入formList参数和插槽的方式实现表单项的定制化渲染 组件的封装 HCommonFormItem 根据传入的"formList"参数生成一组表单项&#xff0c;并通过插槽&#xff08;slot&#xff09;将表单项渲染出来。 在component…

编程模拟支付宝能量产生过程--数据控制流

#模拟支付宝蚂蚁森林的能量产生过程 behavior_points { # 定义行为对应的积分"步行": 2,"生活缴费": 10,"线下支付": 5,"网络购票": 5,"共享单车": 10 }total_points 0 # 初始化总积分while True: # 开…

【Python】基础练习题_文件及数据格式化

&#xff08;1&#xff09;从键盘输入一些字符&#xff0c;逐个把它们写到磁盘文件"test1.txt"上&#xff0c;直到输入一个#为止。 file_name "test1.txt"with open(file_name, "w") as file:while True:char input("请输入字符&#xf…

10倍提升启动的时间?Graalvm打包Springboot+MyBatis实测

graalvm使用前后对比图 相关代码博客&#xff1a;https://blog.csdn.net/weixin_43914278/article/details/134446327 工具大小时间graalvm打包的exe文件84.14MB0.251秒graalvm打包的docker文件121.27MB0.253秒jar包51.34MB2.153秒 解析 文件大小: graalvm打包的Docker文件…

苍穹外卖项目笔记(7)— 微信登录、商品浏览

前言 苍穹外卖项目代码&#xff1a;https://github.com/Echo0701/take-out 1 HttpClient 1.1 介绍 HttpClient 是 Apche Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且支持 HTTP 协议最新…

CUDA简介——For循环并行化

1. 引言 前序博客&#xff1a; CUDA简介——基本概念CUDA简介——编程模式 kernel相关语法定义为&#xff1a; kernel函数定义&#xff0c;与常规C函数定义类似。不同之处在于&#xff0c;有__global__关键字。 为说明符&#xff0c;告诉编译器该函数应编译运行在device上&a…

java easyPOI导出一对多数据,设置边框,字体,字体大小

java easyPOI导出一对多数据&#xff0c;设置边框&#xff0c;字体&#xff0c;字体大小 需求总是千奇百怪&#xff0c;解决的方式也可以是多种多样。 今天碰到导出excel是一对多结构的&#xff0c;以往导出的数据都是一条一条的&#xff0c;所以采用的是比较方便简单的方法eas…

linux 路由表的优先级

查看路由规则 [rootlocalhost cc]# ip rule list 0: from all lookup local 32765: from 10.0.19.24 lookup 4096 32766: from all lookup main 32767: from all lookup default 现在有 4 条路由规则&#xff0c;优先级是怎样的&#xff0c;0 代表最低优先级还是最高优先级 在…

pytest-yaml 测试平台.新增项目和用例

基于pytest-yaml-yoyo 框架写的接口测试平台&#xff0c;在web网页平台上维护yaml测试用例&#xff0c;执行用例&#xff0c;并查看allure报告。 pytest-yaml-yoyo 框架简介 pytest-yaml-yoyo 框架是上海-悠悠 2023年自主开发的pytest结合yaml框架。gitee项目地址https://gite…

综合指南:如何创建有效的知识地图?

知识地图是知识管理中的重要工具&#xff0c;使企业能够有效地利用其资产。它促进了解决问题、新人整合和组织学习。此外&#xff0c;它还提高了生产力&#xff0c;实现了数据驱动的决策&#xff0c;并优化了流程。通过捕获和组织有价值的知识资产&#xff0c;它确保了专业知识…