![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
文章平均质量分 68
从MySQL的底层来更好的理解MySQL的组织架构
张孟浩_jay
分享Java后端、MySQL、数据结构、计算机基础、算法、并发编程技术!欢迎朋友们交流关注,共同进步!
展开
-
MySQL之慢查询日志
MySQL中慢查询日志用来记录MySQL中原创 2021-10-17 16:22:08 · 517 阅读 · 2 评论 -
MySQL之乐观锁和悲观锁详解
相信所有后端选手每个人都听说过乐观锁和悲观锁吧,本文就详细说下乐观锁和悲观锁的区别。场景乐观锁和悲观锁主要针对于先读后写的场景。如果是全读的话,没必要加锁。如果是全写的话,没必要用悲观锁。我们拿账户扣钱的例子来说明一下://查询余额select balance from deposit where id = xx;//扣除余额update deposit set balance -= 100 where id = xx;系统首先查询出账户的余额,然后将余额减去100。为什么要提前查一原创 2021-10-16 09:59:57 · 521 阅读 · 1 评论 -
MySQL之子查询
MySQL可以执行子查询,也就是在查询中嵌套查询子查询分为两类:关联子查询和非关联子查询假设系统现在有两个表,分别为 user 和 order。user 为用户表,有id,name两个字段order为订单表,有oid,userid两个字段。我们现在需要求出所有买过东西的用户的name。非关联子查询非关联子查询 指的是 子查询 的查询条件 不依赖于 外部查询的数据select name from user where user.id in (select userid from order);原创 2021-10-15 22:50:05 · 304 阅读 · 1 评论 -
MySQL之groupby详解
MySQL中提供了groupby关键字,用来对数据进行分组,用来统计分组的信息。groupby的原理select id%10 as m, count(*) as c from t group by m;上述的sql是对id进行分组,对10取模相同的id分到一组,然后获取组内的数量。groupby的流程如下:1、创建一个内存临时表temp,表里有两个字段 m 和 c,m为主键2、从表 t 中选取一个最合适的索引,依次的读取出对应的id值,然后将id%10 = mm,对于结果有两种处理方式:a原创 2021-10-15 16:00:55 · 10824 阅读 · 1 评论 -
MySQL中join详解
大家对join应该都不会陌生,join可以将两个表连接起来。join流程详解join 是指 将两个表连接起来,两个表分别为 驱动表 和 被驱动表。我们拿下面的这个sql举例,select t1.id,t2.id from t1 inner join t2 on t1.id = t2.id where t1.id > 10;t1和t2 都对 id 建立了索引,我们假设 t1 是驱动表,t2是被驱动表。join流程如下:1、MySQL每次从t1中读取一行满足过滤条件t1.id>原创 2021-10-14 23:02:40 · 2084 阅读 · 1 评论 -
MySQL之数据发送流程
数据发送流程MySQL是CS架构的,也就是基于客户端-服务器模式,读取数据流程如下:1、客户端通过TCP与服务器建立连接2、客户端通过网络发送一个查询数据包,里面包含了对应的sql语句3、服务器收到查询数据包后,取出并执行里面的sql语句,将结果通过网络返回给客户端。这里面有个问题,如果查询一个大规模数据的话,服务器会将所有的数据都读取到内存中吗?会不会把内存都打爆?其实不是的,MySQL是边读取边发送的。MySQL没必要把所有数据都读取到内存中,因为数据最终要通过网卡发送出去,网卡不可能一下原创 2021-10-14 18:58:37 · 1510 阅读 · 1 评论 -
MySQL中随机选取元素
有点时候,我们会需要随机选取表中的一个记录,以下有几种方法可以随机选择1、select * from t where id >= rand limit 1rand是一个随机值,我们可以首先获取n = min(id)和m = max(id)rand = n + rand()*(m-n);rand是介于 最大 id 和最小id之间的一个id。优点:快速方便,只需要扫描三行记录就可以获取到缺点:如果id分布不均匀的话,会出现伪随机,也就是每个id被选取的概率不相等。比如1,2,4,5。4被原创 2021-10-13 21:06:41 · 1304 阅读 · 1 评论 -
MySQL之orderby详解
MySQL中原创 2021-10-13 12:14:01 · 11147 阅读 · 1 评论 -
为什么sql语句执行突然变慢了
当我们执行一条sql的时候,突然变得很慢,这可能有是哪些原因呢?1、刷脏页MySQL读取磁盘的数据页的时候,会在BufferPool中保存对应的副本。当下一次读取的时候,直接读取内存就ok了,这也叫做读缓存。MySQL中BufferPool会在内存中专门开辟一块内存空间来存放对应的内存缓存页。当更改对应的数据页的时候,先会修改内存中的数据,然后写redolog,不会直接更改磁盘中的数据。随着MySQL的不断运行,内存页会分为三类:1、还未被使用的2、被使用,页中的数据没有被更改3、被使用,页原创 2021-10-11 16:45:14 · 1429 阅读 · 1 评论 -
MySQL分库分表
随着MySQL中的数据越来越多,查询一个数据会越来越慢,性能也就出现了瓶颈,所以出现了分库分表的策略。本文以商城项目为例,讨论一下MySQL的分库分表。一个商城项目中的数据库有以下两个核心表:1、用户表2、订单表垂直分库假如系统现在并发很大,用户访问用户表和订单表。我们可以采用分库的方法。之前是一个数据库中 包含 用户表 和 订单表,现在我们将将数据库分为两个库,一个库存放用户表,一个库存放订单表,然后将这两个库分别部署到两台机器上。这样的话,之前所有的请求都落到一台机器上了,现在分到了两台原创 2021-10-10 20:56:09 · 268 阅读 · 1 评论 -
MySQL中实现并、交、差
简介sql叫做结构化查询语言,本质利用的就是关系代数中的操作,比如常用的并、交、差、投影、选择等操作。其中并、交、差是常用的操作,本文就看看MySQL中的sql语言是怎么提供对应的关系代数操作的。并并的符号是∪,含义就是将两个集合合并到一块。MySQL中提供的是union关键字,会去重select id from A union select id from B; //A B数据结构一定要一样MySQL中还提供了union all 关键字,不会过滤重复元素。select id from原创 2021-10-04 11:03:51 · 2551 阅读 · 1 评论 -
MySQL之rank排名
本片文章我们来说一下MySQL中的排名问题。如上图所示,表中有一列score,我们现在按照score进行排名。MySQL中有四大函数用来排名:1、row_number()如上图所示,row_number()对于score相等的情况rank并不相同2、rank()如上图所示,rank()对于score相等的情况rank相同,并且同时会将下一行的rank+13、dense_rank()如上图所示,dense_rank()对于score相等的情况rank相同,但是不会将下一行的rank+1原创 2021-08-14 12:08:51 · 731 阅读 · 1 评论 -
MySQL之连接
MySQL中的连接是用来查询多个表来获得数据的方式:分为内连接和外连接。外连接又分为:左外连接、右外连接、全连接原创 2021-08-14 10:58:00 · 120 阅读 · 1 评论 -
MySQL杂谈之count(*)
本文针对的是innodb引擎查询原理随着表中数据越来越多,count()命令也就越来越慢。我们看下count()的原理:1、找到数据量最小的索引:数据量越小,统计过程中需要从磁盘中读取的数据页就越少,效率也就越高。2、从前到后遍历索引的叶子节点,统计数量count(*)、count(id)、count(字段)性能分析1、count(*):引擎直接按行累加2、count(id):引擎将id字段取出来,然后按行累加3、count(字段):引擎将字段取出来,然后判断是否为null,如果不为null原创 2021-08-01 13:13:46 · 371 阅读 · 1 评论 -
MySQL杂谈之怎么给字符串加索引
假设我们的系统有一个根据邮箱查找用户的需求select * from t where email = 'xx';加索引方式1、**直接对email字段加索引:**对整个字符串加索引 index1查找过程为:1、首先在index1中查找到email对应的主键id2、利用主键id回表查询对应的数据行。相当于只扫描了一行2、**前缀索引:**就是对字符串的前n个字符来加索引 index2;查找过程为:1、首先在index2中查找到符合email前n个字符的对应的主键id2、根据主键id回表原创 2021-08-01 12:11:42 · 255 阅读 · 1 评论 -
第八篇:MySQL之锁详解
1、加锁的原因1、事务并发造成的数据不一致,举例如下:事务A:update test set k = k + 1 where id = 1;事务B:update test set k = k + 1 where id = 1;按照正常执行的话,提交完事务A和B后,k会变成k+2;如果不对对应记录加锁的话,事务B和事务A同时更新的话,会导致k变成k+1,导致数据丢失。2、导致幻读我们都知道MySQL中的读分为两种:1、快照读:读取的不一定是最新的数据,读取的是MVCC为事务提供的快照。原创 2021-07-31 17:48:41 · 814 阅读 · 1 评论 -
MySQL8.0——锁的坑记录 select * from information_schema.innodb_locks
*1、*select * from information_schema.innodb_locks报错:1109 - Unknown table ‘INNODB_LOCKS’ in information_schema解决办法:innodb_locks表在8.0.13版本中由performance_schema.data_locks表所代替,innodb_lock_waits表则由performance_schema.data_lock_waits表代替。...原创 2021-07-30 09:21:22 · 4312 阅读 · 0 评论 -
第七篇:MySQL之索引
索引的基本思想我们都知道算法设计里面有一个非常经典的思想:用空间复杂度来换取时间复杂度的下降!索引就是用额外的空间来增加数据库的查询效率。原创 2021-07-26 22:54:59 · 555 阅读 · 1 评论 -
第六篇:MySQL之事务
事务的概念事务是数据库的最小的操作单元,要么全部执行,要么都不执行。事务是MySQL中存储引擎方面支持的功能。MySQL支持多引擎,但是不是所有的引擎都支持事务,MyISAM不支持事务,InnoDB支持事务。事务的特征1、原子性事务中的操作要么完全执行,要么都不执行2、持久性事务提交后的数据要能够持久保存,即使系统故障数据也不会丢失。3、隔离性并发事务之间需要有一定的隔离性,防止数据的不一致。4、一致性事务执行前后,数据前后要保持一致。原子性事务的原子性,InnoDB是通过undol原创 2021-07-24 18:46:00 · 314 阅读 · 1 评论 -
第一篇:MySQL架构
MySQL架构图相关知识点1、连接器1.1、Q:使用长连接还是短连接?A:如果一个连接需要频繁的使用数据库,就是用长连接1.2、Q:使用长连接导致内存紧张A:1、定期断开长连接,重新连接2、初始化长连接,不需要重新验证权限和连接2、存储引擎存储引擎是以插件的方式存在的,MySQL有着多个的存储引擎,如InnerDB、MemoryDB,每个存储引擎通过提供接口来供执行器使用。...原创 2021-07-20 14:37:20 · 127 阅读 · 1 评论 -
第二篇:MySQL之InnoDB物理存储结构
MySQL中InnoDB引擎的物理存储结构1. 个人理解看了很多MySQL的书籍和博客,感觉都是互相抄来抄去,把知识点的罗列,讲不清楚前因后果,让人看起来莫名其妙的。所以,我决定从MySQL的底层物理存储结构了解,掌握了InnoDB的物理存储结构,再理解索引,锁,事务,日志之类的上层优化就很容易了。2. 知识来源本文主要观点来自于阿里数据库内核月报http://mysql.taobao.org/monthly/2016/02/01/和一篇CSDN博客https://blog.csdn.net/原创 2020-11-19 17:19:57 · 2298 阅读 · 3 评论 -
第三篇:MySQL中InnoDB的undo日志的物理结构、事务回滚、MVCC
本篇介绍知识InnoDB中的undolog的物理组织结构、以及事务回滚和MVCC的原理。只是说清楚大致原理,不会深入细节。都是个人观点和理解,如存在错误,请批评指正!知识来源阿里数据库内核月报阿里数据库内核月报之undologundo的物理结构undo的组织结构从上到下为回滚表空间、回滚段 (undo log segment)、undo log slot(后文简称slot)、page。page仍然是基本单位,回滚段为逻辑上的结构,slot是一个特殊的page页,分为两部分1、因为一个事务的原创 2020-11-25 17:56:09 · 1294 阅读 · 1 评论 -
第四篇:MySQL之binlog和redolog
引言这篇文章说下MySQl中的恢复日志中的binlog和redolog。binlogbinlog称为二进制日志或者归档日志,主要记录除查询以外的操作(delete、update、insert、DML等),主要用于主从复制和数据恢复。binlog的数据格式有如下三种格式做法优点缺点STATEMENT直接记录相关的SQL语句,在恢复的时候直接执行SQL语句数据量小,节省磁盘IO由于某些函数UUID()、NOW()等函数,并且需要上下文关联,容易造成主从复制不一致RO原创 2021-07-22 15:43:12 · 1785 阅读 · 1 评论 -
第五篇:MySQL之缓冲池(buffer pool)和写缓冲(change buffer)
1、buffer poolbuffer pool的优点buffer pool是MySQL在内存中开辟的一片区域,用来存放磁盘中的数据页。利用redolog和buffer pool可以提高读取效率。当要读取的数据页在buffer pool中,直接在内存中读取得到,不用再读取磁盘。如果要修改数据页,将相关日志顺序写道redo log file中。buffer pool的管理算法MySQL中的buffer pool采用的改进版的LRU算法。MySQL在从磁盘往内存中读取数据页时,会额外读取周围的数据原创 2021-07-22 19:53:13 · 1025 阅读 · 4 评论