mysql全方位知识大盘点
一、mysql都有哪些存储引擎?各自的特点是什么?
| 引擎 | 事务 | 锁 | 主键 | 索引 | 外键 | 数据结构 | 适用场景 |
| InnoDB | 支持 | 行锁、表锁 | 必须有主键,没有设置会自动创建 | 主键索引和数据在一起,其他索引执行主角索引 | 支持 | 2个文件,一个是表结构,一个是索引和数据 | 事务、增删改频繁 |
| MyISAM | 不支持 | 只支持表锁 | 可以没有主键 | 索引存放数据的地址 | 不支持 | 3个文件,一个是表结构,一个是索引文件,一个是数据 | 只适合查询 |
二、客户端一条sql语句的执行过程?

1.客户端和mysql创建连接,是半双工通信模式,即同一时间客户端和mysql只有一方在发送数据
2.查询缓存
3.查询优化,包含sql解析,sql预处理(检验sql的合法性),查询优化器进行sql优化
4.调用存储引擎的API执行sql语句
5.返回结果给客户端,如果设置了缓存则存放缓存
三、mysql的缓存机制?
mysql可以设置查询缓存,可用性不高,一是因为缓存一般设置的内存不大,难以存放大数据量的缓存;二是因为缓存实际相当于map形式,key是sql语句,value是结果,只有当sql语句完全一样才能命中缓存,多一个空格都不行;三三因为一旦数据库执行update、insert或delete操作,缓存都将会被清除。
四、客户端和mysql连接的状态?
sleep:线程等待客户端发送数据(等待客户端发送sql语句,最常见的状态)
query:线程正在执行客户端的sql语句
Locked:线程正在等待锁的释放
sorting result:线程正在对结果进行排序
sending data:线程正在给客户端返回数据结果
五、mysql的执行计划?
通过explain语句,可以查询sql语句的执行计划
六、mysql索引机制
七、mysql的事务机制
mysql的事务表示一组sql语句要么全部被执行要么全部不执行
1.事务的四大特性(ACID)
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2.事务的四种隔离级别
事务的隔离性是为了解决数据库在并发操作时的一些问题,那么再了解事务隔离级别时先分析下事务在并发情况下都有哪些问题?
1.脏读
事务A执行更新操作但是还没有提交或回滚,事务B就查询到了事务A更新过后的数据
2.不可重复读
事务B先执行查询语句,事务A执行更新操作并且提交了,事务B再执行和之前相同的查询语句,发现和第一次查询的结果不一样
3.幻读
当事务B执行了两次相同查询操作之间,事务A执行了插入操作,虽然事物B没有发现不可重复读问题,但是发现多了新的数据
针对这三种问题,mysql提供了四种事务隔离级别来解决这一问题
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 未提交读(read-uncommitted) | 没解决 | 没解决 | 没解决 |
| 已提交读(read-committed) | 解决 | 没解决 | 没解决 |
| 可重读读(repeatable-read) | 解决 | 解决 | 没解决(innodb通过锁机制解决) |
| 串行化(serializable) | 解决 | 解决 | 解决 |
innoDB未提交读:对更新操作的事务添加排他锁,则在提交之前,其他事务无法读取
innoDB已提交读:对查询操作的事物添加共享锁,则在事务完成之前,其他事务无法更新
innoDB可重复读:对范围查询时无数据的间隙中添加gap锁,则数据锁无法插入的,如select * from XX where id > 10,则大于10的空间添加gap锁即可
innoDB串行化:所有sql语句按顺序执行,不存在并发问题,锁的是整个表
八、mysql的锁机制
1、锁的种类
| 锁 | 简称 | 级别 | 作用 | 用法 |
| 共享锁 | S锁、读锁 | 行锁 | 当前事务加读锁,其他事务只可读不能修改 | sql语句加
LOCK IN SHARE MODE
|
| 排他锁 | X锁、写锁 | 行锁 | 当前事务加写锁,其他事务不可获取任何锁,包括读锁和写锁 | sql语句加 for update以及update、insert和delete语句自动加X锁 |
| 意向共享锁 | IS锁 | 表锁 | 有任一事务添加共享锁时,数据库自动维护意向共享锁 | 并非真正的锁,而是相当于当前表的锁的状态 |
| 意向排他锁 | IX锁 | 表锁 | 有任一事务添加排他锁时,数据库自动维护意向排他锁 | 并非真正的锁,而是相当于当前表的锁的状态 |
2、锁的实现原理
锁的本质是对索引进行加锁,如果锁的数据是按主键锁的,就直接锁住主键索引;如果是非主键索引,那么就通过非主键索引找到主键索引进行加锁;如果没有通过索引加锁,那么就会遍历表的聚集索引(默认的主键索引),也就相当于锁住了整个表
3、锁的算法
Record Lock:行锁,通过主键索引或唯一索引等值查询,精准匹配之后锁住的数据行
Gap Lock:间隙锁,数据不存在的连续区间)如当id>30时,id=11也会被锁,因为连续的是从10开始的,范围查询或等值查询记录都不存在时使用,相同 间隙锁之间不冲突,退化成Gap Lock
Next-Key Lock:临键锁,相当于Gap+Record的集合,采取左开右闭原则,innodb的默认锁,没有成功就会退化成gap,或者由gap再退化成record

九、mysql的sql语句的关键字顺序
1、from,第一步是找到查询的表
2、on,如果是关联查询,需要用on关联两个表
3、where 找到了需要查询的表,就需要采用where来对数据进行过滤
4、group by,对过滤的数据进行分组(返回的是一个游标而不是一个表,所以可以从这之后使用别名,而where就不可)
5、having 对group by的结果进行过滤
6、select 查询需要返回的列
7、order by对返回对数据进行排序
mysql全方位知识大盘点的更多相关文章
- 《.Net 的冰与火之歌》寄雁传书,你必须知道的C#参数知识大盘点
引言 参数,也叫参变量,是一个变量.在方法签名中随处可见,实现了不同方法间对于数据的寄雁传书,基本上充斥在代码的各个角落里.在方法签名或者原型中,方法名称后的括号包含方法的参数及其类型的完整列表.参数 ...
- mysql日志体系大盘点
MySql日志文件主要包含:错误日志.慢查询日志.事务日志.二进制日志等 Mysql的日志配置可以通过命令 show global variables like '%log%'; 执行的结果如下 &q ...
- MySQL系列(一)--基础知识大总结
MySQL系列(一)---基础知识大总结 前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里只是作为简单的介绍,但是具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续 ...
- MySQL高级知识(十六)——小表驱动大表
前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...
- 当今游戏大作share的特性大盘点
极品游戏制作时的考虑要素大盘点 不知不觉入坑Steam已近4年,虽然说Steam的毒性让很多人走向一条不归路,但是想我这样即使"中毒"还是很快乐很感恩的.那么本期文章就谈谈我对其中 ...
- Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数
mysql数据库知识-Mysql索引总结: 索引(Index)是帮助MySQL高效获取数据的数据结构. 下边是自己整理的资料与自己的学习总结,,做一个汇总. 一.真的有必要使用索引吗? 不是每一个性能 ...
- 2018 AI产业界大盘点
2018 AI产业界大盘点 大事件盘点 “ 1.24——Facebook人工智能部门负责人Yann LeCun宣布卸任 Facebook人工智能研究部门(FAIR)的负责人Yann LeCun宣布卸 ...
- MySQL高级知识(十四)——行锁
前言:前面学习了表锁的相关知识,本篇主要介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 0.准备 #1.创建相关测试表tb_ ...
- MySQL高级知识(十三)——表锁
前言:锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算机资源(如CPU.RAM.I/O等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...
随机推荐
- 一篇文章带你编写10种语言HelloWorld
0,编程语言排行榜 计算机编程语言众多,世界上大概有600 多种编程语言,但是流行的也就几十种.我们来看下编程语言排行榜,下面介绍两种语言排行榜. Ⅰ TIOBE 指数 该指数每月更新一次,它监控了近 ...
- C语言实现数组循环左移
c语言实现数组左移: 例如输入: 8 3 1 2 3 4 5 6 7 8 输出: 4 5 6 7 8 1 2 3 #include <stdio.h> int main(int argc, ...
- 小米Note 10 Lite海外发布 无缘中国市场
[TechWeb]5月1日消息,昨日晚间,小米Note 10 Lite在海外亮相.小米市场部副总经理臧智渊在微博透露,小米Note 10 Lite 6GB+64GB版售价349欧元(约合人民币2700 ...
- 【已解决】React项目中按需引入ant-design报错TypeError: injectBabelPlugin is not a function
react项目中ant-design按需加载,使用react-app-rewired的时候报错 运行npm start或者yarn start报如下错误: TypeError: injectBabel ...
- 高可用性GRE+IPSEC中心—分支
在实际网络运用中我们时常跑GRE+IPSEC来实现我们中心到分支的远程访问回话,这样以来容易配置,而来可用性高,我们知道L2L无论是链路备份还是设备备份,都不是状态备份,当一个点断掉后,用经过几十秒甚 ...
- hdu2544最短路
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助 ...
- swipe 滑动操作
1.swipe() 滑动用法 swipe(self, start_x, start_y, end_x, end_y, duration=None) :Args: - start_x - 开始滑动的x坐 ...
- 多阶段构建Golang程序Docker镜像
Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议.Docker自开源后,受到广泛的关注和讨论. Docker在 ...
- IDEA 2020.1 安装教程
目录 IDEA 2020.1 安装教程 准备工作 破解教程 IDEA 2020.1 安装教程 IDEA 2020.1 安装教程 Win 10 版 64位操作系统 准备工作 IDEA旗舰版下载地址 je ...
- python学习之break和continue在for循环中的使用(案例:打印出10以内的偶数,并且只要前三个偶数)
运行程序,break是整个程序都跳出 continue则表示跳过当前一次循环,然后继续执行循环