一、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

间隙锁,数据不存在的连续区间)如当id>30时,id=11也会被锁,因为连续的是从10开始的
范围查询或等值查询记录都不存在时使用,相同 间隙锁之间不冲突,退化成Gap Lock

九、mysql的sql语句的关键字顺序

1、from,第一步是找到查询的表

2、on,如果是关联查询,需要用on关联两个表

3、where 找到了需要查询的表,就需要采用where来对数据进行过滤

4、group by,对过滤的数据进行分组(返回的是一个游标而不是一个表,所以可以从这之后使用别名,而where就不可)

5、having 对group by的结果进行过滤

6、select 查询需要返回的列

7、order by对返回对数据进行排序

mysql全方位知识大盘点的更多相关文章

  1. 《.Net 的冰与火之歌》寄雁传书,你必须知道的C#参数知识大盘点

    引言 参数,也叫参变量,是一个变量.在方法签名中随处可见,实现了不同方法间对于数据的寄雁传书,基本上充斥在代码的各个角落里.在方法签名或者原型中,方法名称后的括号包含方法的参数及其类型的完整列表.参数 ...

  2. mysql日志体系大盘点

    MySql日志文件主要包含:错误日志.慢查询日志.事务日志.二进制日志等 Mysql的日志配置可以通过命令 show global variables like '%log%'; 执行的结果如下 &q ...

  3. MySQL系列(一)--基础知识大总结

    MySQL系列(一)---基础知识大总结 前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里只是作为简单的介绍,但是具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续 ...

  4. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  5. 当今游戏大作share的特性大盘点

    极品游戏制作时的考虑要素大盘点 不知不觉入坑Steam已近4年,虽然说Steam的毒性让很多人走向一条不归路,但是想我这样即使"中毒"还是很快乐很感恩的.那么本期文章就谈谈我对其中 ...

  6. Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数

    mysql数据库知识-Mysql索引总结: 索引(Index)是帮助MySQL高效获取数据的数据结构. 下边是自己整理的资料与自己的学习总结,,做一个汇总. 一.真的有必要使用索引吗? 不是每一个性能 ...

  7. 2018 AI产业界大盘点

    2018  AI产业界大盘点 大事件盘点 “ 1.24——Facebook人工智能部门负责人Yann LeCun宣布卸任 Facebook人工智能研究部门(FAIR)的负责人Yann LeCun宣布卸 ...

  8. MySQL高级知识(十四)——行锁

    前言:前面学习了表锁的相关知识,本篇主要介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 0.准备 #1.创建相关测试表tb_ ...

  9. MySQL高级知识(十三)——表锁

    前言:锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算机资源(如CPU.RAM.I/O等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...

随机推荐

  1. Github第三方登录

    笔者第一次写网站只写了接收参数以及登录页面就兴奋了一整天,还特意地加上了第三方登录,想起当时的情景还历历在目.之前是照着被人的博客一步步完成第三方登录的功能,现在就要自己来理解完成了 1. OAuth ...

  2. 关于用C-free进行C语言编程在电脑中生成的.exe和.o文件

    在使用C-free进行C语言编程时,程序运行后会自动在电脑文件中生成以.exe和.o为后缀名的文件: 1,生成的.exe文件为系统自动打包完成的应用程序,该程序可直接在其他无C-free环境的电脑上运 ...

  3. Google Play商店为预注册的游戏和应用提供自动安装功能

    谷歌 Play 商店一直在准备一项功能,它可以自动安装用户预先注册的应用程序和游戏.似乎该功能现已开始向第一批用户推出.有些人在预注册时会看到一个新选项,使他们能够利用发布时自动安装的功能. 用户在 ...

  4. 控制台报错 [WDS] Disconnected!

    Webpack 的 HMR 功能,是通过 WebSocket 实现的推送 JSON Patch,同时需要第三方库支持. 具体解决方案: 热加载(HMR)是 Webpack Dev Server 最强大 ...

  5. Python-四则运算-蔡晓晴,杜婷萱

    github链接:https://github.com/Amy-CC/Arithmetic-Operation 一.需求 1.使用-n 参数控制生成题目的个数 2.使用-r 参数控制题目中数值(自然数 ...

  6. Java——多线程锁的那些事

    引入 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. 下面先带大家来总体预览一下锁的分类图 1.乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了 ...

  7. Java——SSM整合所需的Maven配置文件

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  8. Redis服务器和客户端的通信

    Redis客户端使用RESP(Redis序列化协议)与Redis服务器进行通信,RESP在位于TCP之上,而网络模型上客户端和服务器是保持的双工的连接.如图1 而一个简单的请求/响应的串行通信模型如下 ...

  9. springmvc与struts2执行流程比较

    之前写过一篇struts2的执行流程的文章了,这里对struts2的流程就不做过多的分析,这篇文章主要分析spring-mvc的执行流程以 及struts2与spring-mvc的差别. 1.stru ...

  10. Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序

    分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...