Mysql知识梳理
Mysql知识梳理
- 索引
- 索引分类
- 索引未命中的原因
- 性能调优命令Explain
- 回表
- mysql性能优化
- 事务
- 四大特性
- 事务隔离级别
- 设置事务隔离级别
- 存储引擎
- 聚簇索引和非聚簇索引
- 聚簇索引
- 非聚簇索引
- 最左前缀结合原则
- 全文索引
索引
索引分类
mysql有普通索引、空间索引、主键索引、唯一索引、组合索引和全文索引。
- 普通索引:使用字段关键字建立的索引,主要目的是提高查询速度。
- 空间索引:前只有MyISAM引擎支持,用于空间类型的字段,不允许为空。
- 唯一索引:索引列中的值必须是唯一的,但允许为空值。
- 主键索引:是一种特殊的唯一索引,不允许有空值
- 组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,遵循最左前缀集合原则。
- 全文索引:一种特殊类型的索引,主要用于全文搜索。
索引未命中的原因
- 没有查询条件,或查询条件中没有索引
- 条件中有or,并且不是所有的条件都有索引
- like左匹配或者int字段
- 索引列是字符串,但是sql中未加引号
- 条件中在索引列使用函数
- 采用not in/not exist查询
- B-tree索引 is null不走索引,is not null才走索引
- 联合索引不满足最左原则
性能调优命令Explain
explain用于解析sql的执行计划,执行计划是MySQL为了执行查询语句而制定的优化方案,包括数据的读取顺序、表的访问方式、索引的使用情况等信息。
以下是使用EXPLAIN指令的基本语法:
EXPLAIN SELECT column1, column2 FROM table_name WHERE condition;
使用EXPLAIN指令后,MySQL会返回一个表格,其中包含以下信息:
- id:查询的标识符,id越大的越先执行。
- select_type:查询的类型,如SIMPLE、PRIMARY、SUBQUERY等。
- table:被查询的表名。
- partitions:被查询的分区信息。
- type:访问表的方式,如ALL、INDEX、RANGE等。
– ALL: 全表扫描;
– INDEX: 索引全扫描。
– range: 范围扫描。
– ref: 使用非唯一索引,或唯一索引的前缀扫描,返回匹配某个单独值得记录行。
– eq_ref: 多表连接中使用,主键或唯一建作为关联条件。
– const/system: 单表中最多有一个匹配行。主要用于比较primary key 或unique索引,因为数据都是唯一的,所以性能最优。
– null: 不用访问表或索引,直接就能得到结果。 - possible_keys:可能使用的索引。
- key:实际使用的索引。
- key_len:使用的索引长度。
- ref:用于比较的值。
- rows:MySQL估计需要读取的行数,数值越大越不好,说明没用好索引。
- filtered:MySQL估计返回的行数占总行数的比例。
- Extra:附加信息,如使用了临时表、文件排序等。
回表
回表指当查询条件(where条件和返回列)不能被索引索引锁覆盖时,需要访问索引中没有的数据,需要通过回表技术访问数据所在页,获取具体得数据。
与回表相对应的是覆盖查询,即查询条件能够被索引所覆盖,不需要回表查询数据,这样查询效率会更高。因此,在设计数据库时,需要根据具体的情况选择合适的索引策略,以提高查询性能。
mysql性能优化
- 优化sql
1.1 使用explain命令解析sql执行计划
1.2 尽量命中索引
1.3 合理设计索引,不是越多越好 - 优化表结构
2.1 经常查询的表尽量避免过大。
2.2 多余常用的字段尽量冗余,避免大表进行联合查询。 - 分库分表进行表瘦身
3.1 水平分库:以字段为依据,将一个库中的数据进行拆分到多个库中。比如按年份进行分库。
3.2 水平分表:以字段为依据,将一个表中的数据进行才分到多张表中。
3.3 垂直分库:以表为依据,按业务将表分到不同的库中。
3.4 垂直分表:以字段为依据,按字段中的活跃度将表中的字段拆分到不同的表,比如主表和扩展表。
事务
四大特性
事务的四大特性ACID,ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)的缩写,是数据库事务的基本属性,用于确保事务的可靠性和一致性。
- 原子性:事务是一个原子操作单元,事务的执行要么全部成功,要么全部失败回滚。
- 一致性:事务必须保证数据库从一个状态改变为另一个状态,并保持数据的一致性和完整性。
- 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
- 持久性:一旦事务提交,对数据库的修改是永久的,即使系统崩溃或故障也能保持。
事务隔离级别
MySQL数据库的事务隔离级别有四个,分别是:读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
- 读未提交:事务中的修改,即使未提交,对其他事务也是可见的。
- 读提交:事务只能看见已经提交的数据修改。
- 可重复读:同一事务中多次读取数据的结果是一致的,但是并发的事务可能会对数据产生影响,导致 不可重复读和幻读。
- 串行化:最严格的事务隔离级别,通过锁机制实现,确保事务串行化顺序执行,能避免不可重复读和幻读,但是效率低下。
mysql默认的事务隔离级别是可重复读。
设置事务隔离级别
在MySQL中,可以使用以下SQL语句设置事务的隔离级别:
SET TRANSACTION ISOLATION LEVEL <isolation_level>;
存储引擎
mysql主要的存储引擎是MyISAM和InnoDB,默认使用的是InnoDB引擎。
使用以下命令查询当前使用的存储引擎:
SHOW VARIABLES LIKE 'storage_engine';
使用以下命令查询所有存储引擎:
SHOW ENGINES;
- MyISAM:不支持事务、不支持外键,索引采用的是非聚簇索引。
- InnoDB:提供了具有提交、回滚等事务功能,支持自动增长列,外键等功能。采用聚簇索引,索引和数据是存储在同一个文件下。
聚簇索引和非聚簇索引
聚簇索引
- 数据挂载在主索引的叶子节点上。
- 辅助索引的叶子节点指向主索引。
非聚簇索引
主索引和辅助索引的叶子节点指向数据存储的位置。
最左前缀结合原则
最左前缀原则就是使用联合索引时,查询条件需要遵循索引中列的顺序,从左到右进行匹配。
在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。当创建(a,b,c)复合索引时,想要索引生效的话,只能使用a、ab、ac和abc四种组合。
select a,b,c from table where a = 'v' ; #索引生效,使用索引a
select a,b,c from table where a = 'v' and b='v1'; #索引生效,使用索引ab
select a,b,c from table where a = 'v' and c='v3'; #索引生效,使用索引a
select a,b,c from table where a = 'v' and b='v1' and c='v3'; #索引生效,使用索引abc
注意:实践证明,where后面的条件顺序并不会影响索引的命中条件,即 ba和ab效果一致。原因是mysql在执行前会对where语句进行自行调优。
全文索引
MySQL的全文索引是一种用于搜索文本内容的索引方式,它可以通过分析文本内容中的关键词,帮助提高检索效率。
MySQL使用全文索引主要分为以下步骤:
创建全文索引:
ALTER TABLE table_name ADD FULLTEXT(column_name);
创建全文索引的查询:
SELECT * FROM table_name WHERE MATCH(column_name) AGAINST('keywords');
在查询语句中,column_name是要查询的列名,keywords是要搜索的关键词。
需要注意的是,只有MyISAM和InnoDB存储引擎支持全文索引,其中MyISAM引擎默认全文索引,InnoDB引擎需要手动创建全文索引。全文索引的查询还需要考虑相关性和阈值,即匹配结果太少可能会查不到结果。
相关文章:
Mysql知识梳理
Mysql知识梳理 索引索引分类索引未命中的原因性能调优命令Explain回表 mysql性能优化事务四大特性事务隔离级别设置事务隔离级别 存储引擎聚簇索引和非聚簇索引聚簇索引非聚簇索引 最左前缀结合原则全文索引 索引 索引分类 mysql有普通索引、空间索引、主键索引、唯一索引、组…...
文生图模型之Stable Diffusion
原始文章地址 autoencoder CLIP text encoder tokenizer最大长度为77(CLIP训练时所采用的设置),当输入text的tokens数量超过77后,将进行截断,如果不足则进行paddings,这样将保证无论输入任何长度的文本&…...
Java List循环安全删除元素
Java List循环安全删除元素的几种方式如下: 使用迭代器(Iterator):通过调用List的iterator()方法获取List的迭代器,然后使用迭代器的remove()方法删除元素。这种方式可以避免在遍历过程中修改List导致的并发修改异常&…...
2023年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536 输入 共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个…...
bert-base-chinese 判断上下句
利用BERT等模型来实现语义分割。BERT等模型在预训练的时候采用了NSP(next sentence prediction)的训练任务,因此BERT完全可以判断两个句子(段落)是否具有语义衔接关系。这里我们可以设置相似度阈值 MERGE_RATIO &#…...
vue3+vue-cli使用mockjs
1.下载mockjs包 npm i mockjs -D 2.main.js中全局引入 // mock模拟后端数据 import /mock/index.js 3.axios下baseUrl注释掉,让其不走本地代理 // 使用mock数据的话,将这一项注释即可 // axios.defaults.baseURL process.env.VUE_APP_BASE_API; 4.s…...
Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题
思路: 要在 Android 应用中全局检测软键盘的弹起,您可以使用 ViewTreeObserver.OnGlobalLayoutListener 监听器来监听布局树的变化。当软键盘弹起或隐藏时,布局树会发生变化,因此您可以在监听器中捕获这些变化。 以下是一个示例…...
第 k 小整数
题目描述 现有 n 个正整数,要求出这 n 个正整数中的第 k 个最小整数(相同大小的整数只计算一次)。 输入格式 第一行为 n 和 k; 第二行开始为 n 个正整数的值,整数间用空格隔开。 输出格式 第kk个最小整数的值;若无…...
LeetCode 1448. 统计二叉树中好节点的数目:DFS
【LetMeFly】1448.统计二叉树中好节点的数目 力扣题目链接:https://leetcode.cn/problems/count-good-nodes-in-binary-tree/ 给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点…...
AR室内导航技术之技术说明与效果展示
随着科技的飞速发展,我们周围的环境正在经历着一场数字化的革命。其中,AR室内导航技术以其独特的魅力,为我们打开了一扇通往全新数字化世界的大门。本文将为您详细介绍这一技术的实现原理、工具应用以及成品展示,带您领略AR室内导…...
06-Numpy基础-线性代数
线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分。 NumPy提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是numpy命名空间中的一个函数) x.dot(y)等价于np.dot(x, y) 符(…...
SpringBootWeb 登录认证
登录认证,那什么是认证呢? 所谓认证指的就是根据用户名和密码校验用户身份的这个过程,认证成功之后,我们才可以访问系统当中的信息,否则就拒绝访问。 在前面的案例中,我们已经实现了部门管理、员工管理的…...
【JVM 内存结构丨栈】
栈 -- 虚拟机栈 简介定义压栈出栈局部变量表操作数栈方法调用特点作用 本地方法栈(C栈)定义栈帧变化作用对比 主页传送门:📀 传送 简介 栈是用于执行线程的内存区域,它包括局部变量和操作数栈。 Java 虚拟机栈会为每…...
LeetCode 138.复制带随机指针的链表
文章目录 💡题目分析💡解题思路🚩步骤一:拷贝节点插入到原节点的后面🍩步骤一代码 🚩步骤二:控制拷贝节点的random进行连接🍩步骤二代码 🚩步骤三:拷贝节点解…...
基于SSM的小说网站的设计与实现(论文+源码)_kaic
目 录 1 绪论................................................................................................... 1 1.1 项目背景................................................................................................................ 1 1.2 发展历程..…...
【Python】代理池针对ip拦截破解
代理池是一种常见的反反爬虫技术,通过维护一组可用的代理服务器,来在被反爬虫限制的情况下,实现数据的爬取。但是,代理池本身也面临着被目标网站针对ip进行拦截的风险。 本文将详细介绍代理池针对ip拦截破解的方法,包含…...
P1065 [NOIP2006 提高组] 作业调度方案
[NOIP2006 提高组] 作业调度方案 题目描述 我们现在要利用 m m m 台机器加工 n n n 个工件,每个工件都有 m m m 道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作,…...
设计模式三原则
1.1单一职责原则 C 面向对象三大特性之一的封装指的就是将单一事物抽象出来组合成一个类,所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。 设计模式中所谓的单一职责原则,就是对一个类而言,应该仅有一个引起它变化的原…...
dll载入时发生的事情
dll是什么 DLL 是一个包含可由多个程序同时使用的代码和数据的库。 对于 Windows 操作系统,操作系统的大部分功能都由 DLL 提供。 另外,当您在这些 Windows 操作系统之一上运行某一程序时,该程序的很多功能可能是由 DLL 提供的。 例如&…...
k8s-ingress-context deadline exceeded
报错: rancher-rke-01:~/rke # helm install rancher rancher-latest/rancher --namespace cattle-system --set hostnamewww.rancher.local Error: INSTALLATION FAILED: Internal error occurred: failed calling webhook "validate.nginx.ingress.kube…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
