
MySQL
文章平均质量分 71
霁云HYY
博客中的很多内容都是取自公众号《儒猿技术窝》中的专栏,进行了一定的修改和总结,感兴趣的同学可以自行查找更加具体的专栏参考和学习
展开
-
如何看懂MySQL的explain执行计划
explain是个程序员应该都知道,但是要如何理解执行计划里面表达的信息呢?里面包含了以下的一些信息:id:复杂的查询语句可能包含多个执行计划,每个id都代表了一个执行计划select_type:执行计划对应的查询类型table:查询的表名partitions:表分区type:使用索引的类型,这个后面细讲possible_keys:可能使用的索引keykey:实际使用的索引keykey_len:索引长度ref:使用某个字段的索引进行等值匹配时,等值匹配的那个目标值的一些信息rows:原创 2021-04-16 19:39:10 · 403 阅读 · 0 评论 -
MySQL中的常见索引规则
在使用索引规则的时候,会有一个前置条件,就是索引的类型一般是联合索引,至于为什么要使用联合索引,是因为数据的增删改都会维护索引,所以过多的索引在方便我们快速查询的时候,同时还会带来一部分的性能问题。这时就需要使用到联合索引了,联合索引既能减少索引的数量,又能满足我们查询的需求全值匹配规则这个规则的使用需要我们在where条件的判断中,根据联合索引的顺序来查询,同时条件必须是等于举个例子,假如我们有一张表,主键就是id,还有name,age,email这些字段,假如我们建立了一个name和age的联原创 2021-02-09 11:56:40 · 586 阅读 · 0 评论 -
MySQL中的聚簇索引和非聚簇索引
我们都知道MySQL的innodb引擎中的索引底层数据结构就是一棵B+树,且查询的时候会根据索引页一页页往下查询,直到找到我们所需要的数据索引有很多种,其中一种就是主键索引,innodb存储引擎一般在我们指定主键的时候就会生成主键索引,如果我们没有指定的话,也会自动生成一个。主键索引就是一个典型的聚簇索引,那么聚簇索引的特点又是什么呢?主键索引在进行数据搜索的时候,会通过二分法不断的找到对应的索引页,最后能确定到唯一一条数据,这条数据是在B+数的叶子节点上,同时会有这笔数据的所有信息,因为找到的这个索引原创 2021-02-08 18:13:22 · 303 阅读 · 0 评论 -
MySQL的索引结构简析
先来讲讲没有索引的情况下是如何来查询数据的吧首先我们应该知道数据都是存储在了一个个的数据页中,在我的上一篇博客《图解MySQL页分裂》中具体讲了数据页的格式,简单来说,数据页中包含了一行行的数据行,且数据行之间是单向链表连接,每个数据页中的数据行的主键都是递增的(如果不是的话则会进行页分裂保证递增),每个数据页之间是双向链表连接的这里假设两种情况,一种是数据量较少,一个数据页就能存储所有的数据的情况,此时如果是根据主键查询,此时会利用上一个页目录的概念,拿正常的目录做类比的话,标题就是主键,页码对应的是原创 2021-01-25 23:32:07 · 204 阅读 · 0 评论 -
图解MySQL页分裂
这一篇博客我们来讲一下页分裂,先抛出一个问题,就是MySQL为什么不推荐使用UUID作为主键?这个我相信大家都知道,因为UUID生成是无序的,而主键最好是自增的,或者有顺序的,至于为什么要这样呢,其实就是因为MySQL会存在页分裂既然数据页会分裂,那么具体是怎么分裂?分裂成什么样的呢?首先来一个数据页的图:上面就是数据页的结构了,首先两个数据页之间会有指针指向上一个和下一个数据页,形成一个双向链表,在数据页中存储的就是一行行的数据了,每个数据行之间会有单向指针连接,组成一个单向链表我们还可以看到原创 2021-01-01 17:40:12 · 12829 阅读 · 9 评论 -
简单图文版MVCC讲解
在讲MVCC之前,当然得知道MVCC解决了什么问题,MVCC(多版本控制)主要解决的是多个事务并发引起的问题这就是老生常谈的问题了,关于数据库的多事务并发问题,我这里稍微带一下:脏写:事务B修改了事务A改过的值,此时事务A未提交,如果事务A最终回滚的话,那么事务B修改的值也就没了脏读:事务B查询了事务A修改过的数据,但是此时事务A还没提交,如果事务A回滚事务的话就会造成事务B再次查询就读不到刚才事务A修改的数据了不可重复读:事务A读取一条数据,事务B修改了这条数据并提交事务,此时事务A在查询的时候原创 2020-12-28 15:27:33 · 485 阅读 · 0 评论 -
MySQL中的undo log简述
上一篇讲完了redo log,这篇博客再来讲最后一个log文件,undo logundo log的作用是事务回滚或者事务提交失败时用来恢复数据的,还有一个作用是用在了MVCC机制中(这个我们后面再讲),undo log跟redo log这种物理日志不同,它是一个逻辑日志当我们执行了增删改操作之后,undo log其实就代表了一个回滚的操作,如果是insert操作,那么undo log就记录的是删除这些数据,如果是delete操作的话,那么就代表的是新增记录,如果是update操作的话,那么就是反向的up原创 2020-12-17 16:07:21 · 706 阅读 · 0 评论 -
MySQL中的redo log详解
redo log重做日志,顾名思义,其实它的作用是在MySQL宕机之后,用来恢复数据的一种log文件,那么为什么需要redo log呢?之前一篇文章我们讲过了Buffer Pool,知道了缓存页的机制,数据的增删改查都是先将磁盘中数据页的数据加载到Buffer Pool中的缓存页,然后再对缓存页中的数据进行操作,如果数据经过了增删改的操作,那么这些数据就是脏数据了,因为缓存页中的数据和磁盘中的数据不一致,一旦MySQL宕机,那么缓存页中的数据就丢了。那如果我们提交了事务,但是缓存页的数据还没来得及刷入磁盘原创 2020-11-30 20:57:18 · 1519 阅读 · 1 评论 -
MySQL中的Buffer Pool到底是个什么玩意儿
InnoDB是MySQL中默认的存储引擎,那么他是如何设计来实现我们MySQL的功能的呢?这篇博客就来剖析一下内部的一些架构设计首先有一个东西叫做缓冲池(Buffer Pool),我们都知道MySQL中的数据都是存储在磁盘上的,那么如果每次都去磁盘上读取数据的话,那么效率肯定很低,所以在内存中就存在一个缓冲池,磁盘中的数据会被缓存到缓冲池中,如果缓冲池存在的话,就不需要再去磁盘中重新读取数据了,而且为了防止缓冲池中的数据被修改,里面的数据还会加一个独占锁。对于InnoDB储存引擎而言,缓冲池配置通过 in原创 2020-11-24 19:18:56 · 479 阅读 · 0 评论 -
MySQL中的一条sql是如何从头走到尾的
MySQL在平时的工作使用中对我们大多数人来说,其实就是对应着一条条的sql语句,对于其中的内部设计,其实知道的人并不多假如我们有一个简单的web应用,当我们接到请求之后,请求会通过Tomcat,此时Tomcat中可能会有很多线程并发的去处理请求,需要处理的这些请求可能就意味着许多的sql,所以如果只有一个数据库连接的话,那不是坑爹了,所以这里就需要一个类似线程池的东西,这就是数据库连接池。数据库连接池除了提供多个数据库连接以供请求,还负责连接系统和MySQL数据库服务器,系统跟MySQL建立连接时,会根原创 2020-11-06 20:48:06 · 190 阅读 · 0 评论