一篇就够mysql高阶知识总结

一、事务的ACID原则

序号原则说明
1原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做
2一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
3隔离性(Isolation)一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
4持久性(Durability)持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响

二、数据库设计的三大范式

序号范式说明
1第一范式(1NF)确保每列保持原子性
2第二范式(2NF)在满足第一范式的前提下,非主属性完全依赖于码
3第三范式(3NF)在满足第二范式的前提下,非主属性不传递依赖于码

三、索引

序号索引类型说明
1二叉树搜索树基础数据结构,用于快速查找、插入和删除
2红黑树平衡二叉搜索树,保持树的平衡以维持操作的高效性
3B树适用于大量数据的磁盘读写操作,保持树的平衡
4B+树B树的变种,非叶子节点不存储数据,更适合作为数据库索引结构
5索引概念数据库中用于提高数据检索效率的数据结构

四、SQL解析

序号内容说明
1SQL解析SQL语句被数据库管理系统解析、编译和执行的过程

五、锁机制

序号锁类型说明
1行锁锁定一行数据
2表锁锁定整个表
3范围锁锁定一定范围的数据
4悲观锁假设最坏情况,数据在修改前会被锁定
5乐观锁假设最好的情况,只在更新操作时检查数据是否被其他事务修改
6读写锁分为读锁和写锁,读锁允许多个读操作并发,写锁则独占

六、JOIN查询

序号内容说明
17种常见的JOIN查询包括INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN等
2SQL语句展示具体的SQL JOIN查询语句
3-9每种JOIN查询的说明与示例分别解释每种JOIN的用法及示例
10Union和Union All介绍UNION和UNION ALL的区别及使用场景

七、索引优化

序号内容说明
1索引分类单值索引、唯一索引、主键索引、复合索引
2Explain性能分析使用EXPLAIN分析SQL查询性能
3索引优化入门案例展示不同场景下的索引优化案例
4索引失效分析分析导致索引失效的常见场景
5分组排序优化优化ORDER BY和GROUP BY的性能
索引分类
序号索引类型说明
1单值索引索引列中的单个值
2唯一索引索引列中的值必须是唯一的,允许NULL值但最多只能有一个
3主键索引特殊的唯一索引,一个表只能有一个主键,且不允许NULL值
4复合索引(组合索引)索引由两个或两个以上的列组成,列的组合值必须唯一或满足特定条件
Explain性能分析
序号字段说明
1sql执行的SQL语句
2idSELECT的标识符,如果查询包含子查询,则会出现多个id
3select_typeSELECT的类型(SIMPLE, PRIMARY, SUBQUERY等)
4table输出行所引用的表
5type连接类型(ALL, index, range, ref, eq_ref, const/system等)
6possible_keys显示可能应用在这张表上的索引,但不一定实际使用
7key实际使用的索引
8key_len使用的索引的长度
9ref显示索引的哪一列或常数被用于查找值
10rowsMySQL认为必须检查的用来返回请求数据的行数估计值
11Extra包含不适合在其他列中显示但十分重要的额外信息,如是否使用索引等
索引优化入门案例
1. 驱动表与被驱动表的选择

在连接查询(如JOIN)中,优化器会决定哪个表作为驱动表(驱动其他表进行连接的表),哪个表作为被驱动表。选择正确的驱动表和被驱动表可以显著提高查询性能。通常,驱动表应该是数据量较小、过滤条件较多、索引效果好的表。

案例
假设有两个表,employees(员工表,包含10万条记录)和departments(部门表,包含100条记录)。如果要查询每个部门下的员工信息,最好让departments表作为驱动表,因为它更小,可以更快地遍历。

SELECT employees.*, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.id
WHERE departments.region = 'Asia';

在这个例子中,尽管employees表在JOIN条件中,但如果departments.region = 'Asia'这个条件能显著减少departments表的结果集,那么优化器可能会选择departments作为驱动表。

2. 单表索引优化

单表索引优化通常涉及为查询中经常作为条件、连接键或排序键的列添加索引。

案例
假设employees表有一个last_name列,经常需要根据员工的姓氏来查询员工信息。

SELECT * FROM employees WHERE last_name = 'Smith';

为了提高这个查询的效率,可以在last_name列上添加索引。

CREATE INDEX idx_last_name ON employees(last_name);
3. 两表索引优化

在两表连接查询中,优化索引可以显著提高性能。通常,应该在连接键和过滤条件上添加索引。

案例
继续上面的employeesdepartments表的例子,如果经常需要根据部门ID和员工的姓氏来查询信息,可以在employees.department_iddepartments.id(如果尚未索引)以及employees.last_name上添加索引。

-- 假设departments.id已经是主键,因此默认有索引
CREATE INDEX idx_emp_dept_id ON employees(department_id);
CREATE INDEX idx_emp_last_name ON employees(last_name);SELECT employees.*, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.id
WHERE employees.last_name = 'Smith';
4. 三表及以上索引优化

对于涉及三个或更多表的连接查询,索引优化的策略与两表类似,但更复杂。通常需要考虑查询中所有表之间的连接键以及过滤条件。

案例
假设还有一个projects表(项目表),其中包含项目信息,每个员工可以参与多个项目。现在需要查询参与特定项目且姓氏为’Smith’的员工及其部门信息。

SELECT employees.*, departments.department_name, projects.project_name
FROM employees
JOIN departments ON employees.department_id = departments.id
JOIN projects ON employees.id = projects.employee_id
WHERE employees.last_name = 'Smith' AND projects.project_name = 'ProjectX';

为了优化这个查询,可以在employees.department_idemployees.id(如果尚未作为主键索引)、employees.last_nameprojects.employee_id以及projects.project_name上添加索引。

-- 假设employees.id和departments.id已经是主键,因此默认有索引
CREATE INDEX idx_emp_dept_id ON employees(department_id);
CREATE INDEX idx_emp_last_name ON employees(last_name);
CREATE INDEX idx_proj_emp_id ON projects(employee_id);
CREATE INDEX idx_proj_name ON projects(project_name);

注意:虽然索引可以显著提高查询性能,但它们也会占用额外的磁盘空间,并且会降低写操作的性能(如INSERT、UPDATE、DELETE)。因此,在设计索引时需要权衡这些因素。

索引失效分析
序号场景说明
1最佳左前缀法则复合索引中,查询条件需要按照索引列的顺序进行
2避免在索引字段上做计算WHERE YEAR(column) = 2023,这会导致索引失效
3避免在索引字段上做范围查询范围查询后的列将无法使用索引(如WHERE a > 10 AND b = 2
4查询字段和索引字段尽量一致避免使用SELECT *,尽量只选择需要的列
5慎用IS NULL和IS NOT NULL对于索引列,这些条件可能导致索引失效
6LIKE的前后模糊匹配LIKE '%keyword%',这将导致索引失效,但LIKE 'keyword%'则有效
7使用UNION或UNION ALL代替OR在某些情况下,UNION/UNION ALL可以更有效地利用索引

八、SQL优化

序号内容说明
1SQL语句优化提供SQL语句优化的方法和技巧
序号内容说明
1ORDER BY之前先使用WHERE等条件过滤掉不需要排序的数据,减少排序的数据量
2WHERE和ORDER BY所用到的索引尽量使用索引来加速WHERE和ORDER BY的操作
3排序的方向必须一致如果WHERE条件中使用了索引的某一列进行排序,确保排序方向一致
SQL语句优化
  • 避免SELECT * :尽量指定需要查询的列,减少数据传输量。
  • 使用表连接代替子查询:在可能的情况下,使用JOIN代替子查询可以提高查询效率。
  • 优化WHERE子句:确保WHERE子句中的条件能够利用索引。
  • 使用LIMIT限制结果集:如果只需要部分数据,使用LIMIT来减少处理的数据量。
  • 合理使用聚合函数:聚合函数(如SUM, COUNT, AVG等)

九、额外优化技术

序号内容说明
1截取查询分析分析慢查询日志,优化大量数据插入等场景
2开启慢SQL查询日志监控并优化慢查询
3show profile使用MySQL的show profile命令分析查询性能

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

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

相关文章

19-1 LLM之野望 1 – 微软打开1-bit LLM时代

让我们面对现实吧,数字不会说谎。 尽管市场因人工智能而上涨,但其效应显然尚未转化为价值,因为只有不到4%的公司使用人工智能来生产商品和服务。 更糟糕的是,虽然一些大公司确实在拥抱人工智能,但高不可攀…

Java案例斗地主游戏

目录 一案例要求: 二具体代码: 一案例要求: (由于暂时没有学到通信知识,所以只会发牌,不会设计打牌游戏) 二具体代码: Ⅰ:主函数 package three;public class test {…

HarmonyOS ArkUi @CustomDialog 和promptAction.openCustomDialog踩坑以及如何选择

CustomDialog 内使用Link,如何正常使用 错误使用方式: 定义一个函数,在函数内使用弹窗,如下面代码showDialog: 这种使用方式,无法在自定义的CustomDialog内使用 Link,进行父子双向绑定&#x…

查看仓库文件的改变(git-status , git-diff)

当你在进行项目开发的时候,想看一下自己改了什么,使用cmd进入项目的路径 输入命令回车,前面带有modified,说明后面这个文件被修改了前面带有deleted, 说明这个文件被删除了这是Untracked files, 这部分文…

BUUCTF逆向wp [MRCTF2020]Xor

第一步 查壳,该题是32位,无壳。 第二步 跟进main,发现反汇编不了 通过下图我们可以发现一串类似字符串的东西 第三步 我们看一下汇编 我们可以得到这些信息:flag的长度为27(下面是对本条指令cmp edx 27指令的应用…

视频素材网站无水印的有哪些?热门视频素材网站分享

当我们走进视频创作的精彩世界时,一个难题常常摆在面前——那些高品质、无水印的视频素材究竟应该在哪里寻找?许多视频创作者感叹,寻找理想的视频素材难度甚至超过了寻找伴侣!但不用担心,今天我将为您介绍几个优质的视…

Python 二进制求和

Python 二进制求和 正文 正文 关于进制转换,可以参考这篇 Python进制转换。对于给定的两个二进制数,比如: a 11 b 1求解它们的和并以字符串形式显示。首先二进制表示是以字符串形式存储的,那么我们要进行运算,首先…

发布支持TS的npm包

你现在有这么一个包,已经将他发布在npm上了,周下载量也还比较可观。美中不足的就是,这个包之前使用js写的,现在你想增加TS类型,提升用户使用体验,那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…

华为od机试真题 — 分披萨(Python)

题目描述 “吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。 但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量…

ubuntu 22.04安装Eigen

1 安装 git clone https://gitlab.com/libeigen/eigen.gitcd eigen mkdir build cd build cmake ..sudo make install... -- Installing: /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry -- Installing: /usr/local/include/eigen3/unsupported/Eige…

Puppet: 强大的配置管理工具

文章目录 引言Puppet官网链接Puppet原理架构与组件工作原理 Puppet基础使用安装常用命令清单文件(Manifests) Puppet高级使用自定义资源类型环境管理幂等性 Puppet的优缺点优点缺点 结论 引言 Puppet是一种开源的配置管理工具,它基于客户端-…

大数据采集工具——Flume简介安装配置使用教程

Flume简介&安装配置&使用教程 1、Flume简介 一:概要 Flume 是一个可配置、可靠、高可用的大数据采集工具,主要用于将大量的数据从各种数据源(如日志文件、数据库、本地磁盘等)采集到数据存储系统(主要为Had…

Leetcoede编程基础0到1——1768. 交替合并字符串 389. 找不同28. 找出字符串中第一个匹配项的下标 242.有效的字母异位词

1768. 交替合并字符串 题目描述: 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 输入输出实例&a…

什么是暂时性死区

文章目录 发现宝藏暂时性死区的定义和原因暂时性死区的特点示例解决方法最佳实践 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 暂时性死区(Temporal Dead Zone&a…

SQL每日一题:删除重复电子邮箱

题干 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 编写解决方案 删除 所有重复…

react 快速入门思维导图

在掌握了react中一下的几个步骤和语法,基本上就可以熟练的使用react了。 1、组件的使用。react创建组件主要是类组件和函数式组件,类组件有生命周期,而函数式组件没有。 2、jsx语法。react主要使用jsx语法,需要使用babel和webpa…

华为“铁三角模式”在数据类项目中的应用和价值

引言:随着信息技术的飞速发展,企业纷纷踏上数字化转型的道路,希望通过数据分析和智能决策来提升企业竞争力。在这一过程中,数据类项目成为关键,它们旨在构建高效的数据治理和分析平台,为企业决策提供有力支…

华为OD机考题(典型题回顾)

前言 经过前期的数据结构和算法学习,以及OD机考题的练习。整理下相关的数学基础和编程思维。以便快速查阅,提升解题效率和技巧。 数学基础 1.根据题干找寻结果计算的规律。 华为OD机考题(HJ37 统计每个月兔子的总数)-CSDN博客 华为OD机考题(HJ53 杨…

python—正则表达式

文章目录 导入re模块常用的元字符re模块match方法分组贪婪匹配编译 Python中的正则表达式是一种强大的文本处理工具,它使用一种特殊的语法来描述字符串的模式。Python通过re模块提供了对正则表达式的支持。使用正则表达式,你可以进行复杂的文本搜索、替换…

【单片机毕业设计选题24072】-基于单片机的智能停车场管理系统

系统功能: 1.根据RFID卡卡号判断新老用户,老用户不计费直接放行,新用户放行时显示计费结果 2.显示屏显示车位剩余数量 3.检测车位有车亮红灯,无车亮绿灯,能够实现车位诱导 5.车辆出停车场时,能根据停车时间计算停车…