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等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...
随机推荐
- java中functional interface的分类和使用
目录 简介 Functional Interface Function:一个参数一个返回值 BiFunction:接收两个参数,一个返回值 Supplier:无参的Function Consumer: ...
- 编写管理IP地址参数脚本(永久性)
1.用各种命令取出/etc/passwd文件前5行的最后一个字母.(2种) 2.编写管理IP地址参数脚本(永久性) a.只能用sed命令完成 b.提示用户变量赋值(IP.子网掩码.网关.DNS等) c ...
- Tomcat中的类是怎么被一步步加载的?
了解Tomcat的类加载机制,原来一切是这么的简单. 一.类加载 在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载. 比如JVM启动时,会通过不同的类加载器加载不同的类.当用 ...
- 关于fastjson在序列化成JSON串时字段增加的问题
今天在项目中遇到控制器中返回的对象经过fastjsonMessageConverter转换后,前台收到的json中多了一个字段A的问题.而返回的这个对象中根本就没有定义这个字段A. 查了好久才发现对象 ...
- (转)logback配置详解
找到一篇很详细的关于logback配置的介绍: 贴上原文链接:logback使用配置详解 1.介绍 Logback是由log4j创始人设计的另一个开源日志组件,它当前分为下面下个模块: logback ...
- Nmon 的安装及使用
一.安装 Nmon 1.下载地址:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download 2.下载对应系统的 nomn 工具(我用 centos6 ...
- memcached线程模型
直接上图: memcached使用多线程模型,一个master线程,多个worker线程,master和worker通过管道实现通信. 每个worker线程有一个队列,队列元素为CQ_ITEM. ty ...
- python恺撒密码 与 字符串反码 【chr()与ord()函数的两种不同应用】
恺撒密码 描述 恺撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下: ...
- Xenia and Colorful Gems(二分--思维)
给定三个数组a,b,c. 要求从每个数字取一个数,使得两两之差和最小. 求出这个数. \(我又懵逼了.我是会O(n^3)的暴力啊,怎么办.\) \(\color{Red}{从结果看,选出来的三个数必定 ...
- Java模拟UDP通信
目录 Java基础:模拟UDP通信 1.一次发送,一次接收 1.1.发送方 1.2.接收方 2.多次发送,多次接收 2.1.发送方 2.2.接收方 3.模拟双方通信 3.1.发送方的线程 3.2.接收 ...