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等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...
随机推荐
- Display a QMessageBox from a QThread
Emit a signal. Since you cannot do UI stuff in a Qthread, instead send your message as an argument o ...
- Zabbix3.0安装部署最佳实践
Zabbix介绍 1.1zabbix 简介 Zabbix 是一个高度集成的网络监控解决方案,可以提供企业级的开源分布式监控解决方案,由一个国外的团队持续维护更新,软件可以自由下载使用,运作团队靠提供收 ...
- Django新手十个开发指导
下面是关于Django新手开发中的一些建议,大家可以参考一下~~ 1,不要将项目名称包含在引用代码里 比如你创建了一个名为"project"的项目,包含一个名为"app& ...
- Libra教程之:Libra testnet使用指南
文章目录 Libra testnet网络 下载和安装Libra 编译Libra client并连接到Testnet网络 创建两个A和B的两个账号 检查libra cli Client是否运行 创建A的 ...
- 【Linux常见命令】diff命令
diff - compare files line by line diff命令用于比较文件的差异. diff以逐行的方式,比较文本文件的异同处. 如果指定要比较目录,则diff会比较目录中相同文件名 ...
- 深入研究Clang(十) Clang Static Analyzer简介
Clang Static Analyzer 官网地址:http://clang-analyzer.llvm.org/ Clang Static Analyer是一个源码分析工具,它可以发现C.C++和 ...
- 线程状态及各状态下与锁和CPU的关系
线程的状态 Thread.State枚举类型中定义了线程的六种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED. 线程在某一时刻只能拥有 ...
- Appium-desktop 元素定位
1.打开 appium-desktop ,点击 start session 2.打开后,点击屏幕右上角的搜索按钮 3.然后会打开配置页面,在本地服务配置信息同上面写的代码链接配置.填入正确的信息后,点 ...
- Linux安装Git-两种方式详细教程)
一.Git介绍 Git --- The stupid content tracker, 傻瓜内容跟踪器.Linus Torvalds 是这样给我们介绍 Git 的. Git 是用于 Linux内核开发 ...
- hdu1074之状压dp
#include <iostream> #include <cstdio> #include <cstring> using namespace std; cons ...