MySQL
文章平均质量分 71
MySQL
秋日的晚霞
Java领域优质创作者 新星计划·第三季【Java后端】第二名
展开
-
《MySql学习》 MySQL的 加锁规则
首先c是有索引的,根据原则 1,加锁单位是 next-key lock,由于 c 不是唯一索引,需要锁住 (0,5]这个区间,且仅访问 c=5 这一条记录是不能马上停下来的,需要向右遍历,查到 c=10 才放弃。但是同时这个符合优化 2:等值判断,向右遍历,最后一个值不满足 c=5 这个等值条件,因此退化成间隙锁 (5,10)。c 是索引,但不是唯一索引,首先等值查询 c=10,然后再向后找到不满足等值的第一个值,原则一,优化二 锁的范围为 (5,15],优化二 退化为 区间锁 (5,15)。原创 2023-03-02 17:25:46 · 1070 阅读 · 1 评论 -
《MySql学习》 幻读的产生与解决
同样假设 select * from t where d=5 for update 只会锁住 d=5 这一行记录 如上图,由于 bin log日志 是在事务提交后(串行)才写入的,session A 的记录是最后写入bin log中,那么如果用bin log做恢复的话,session A中的update 语句最后执行,将导致数据不一致。当你执行 select * from t where d=5 for update 的时候,就不止是给数据库中已有的 6 个记录加上了行锁,还同时加了 7 个间隙锁。原创 2023-03-01 21:45:11 · 134 阅读 · 0 评论 -
《MySql学习》 Select 查询语句慢的非性能原因
因为,SQL语句在执行前,都会打开相应的表对象,如select * from t1语句,会找到t1表的frm文件,并打开表内存对象。为了控制表对象使用的内存空间和其他资源,MySQL会隐式(后台表对象管理线程)或显式(flush tables等)来关闭已打开但并没有使用的表对象。然而,正在使用的表对象是不能关闭的(如SQL请求仍在运行),因此,Flush Tables操作会被正在运行的SQL请求阻塞。但是 id : 86 是我们的查询语句,想找出是哪个会话ID造成的查询语句堵塞,还得使用下面的语句。原创 2023-02-28 15:31:37 · 3160 阅读 · 0 评论 -
《MySQL学习》 索引失效的三种特殊情况
上述SQL,如果 T1表中的 ID 字段 与 T2 表中的 TID 字段 使用的不是同一种字符编码,也会导致索引失效。因为对字段使用函数后,从根节点开始,索引就不知道如何选择了。如果某个字段是字符串类型的,使用where进行判断时,如果与之比较的是数字类型的值,那么将导致索引失效。如上SQL所示,如果声明字段时,no 是varchar类型的,那么此时会将SQL转换为。CREATED_AT 字段建立了索引,此时explain分析的结果表明能使用到索引。变相的对 no 字段使用了函数 也将导致索引失效。原创 2023-02-27 17:48:45 · 334 阅读 · 0 评论 -
《MySQL学习》 表中随机取记录的方式
首先从磁盘扫描10000条数据读入内存临时表中,然后从内存临时表中将10000条数据一条条读入排序内存中,期间使用优先队列排序获取最大的三个值,最后再回到临时表中根据位置信息读取三条记录的值返回。这个临时表使用的是 memory 引擎,表里有两个字段,第一个字段是 double 类型,为了后面描述方便,记为字段 R,第二个字段是 varchar(64) 类型,记为字段 W。我们已知InnoDB排序有单路排序和双路排序,当排序的字段过长时,将使用双路排序导致要多回一次表,增加IO成本。原创 2023-02-26 22:42:43 · 553 阅读 · 0 评论 -
《MySQL学习》 Order by 工作原理
当我们使用explain 分析一条带有排序操作的SQL语句时,会看到Extra中有使用 Using filesortMySQL 会为每个线程分配固定大小的 sort buffer 用作排序。sort buffer 是具有逻辑概念的内存区域,大小由 sort_buffer_size 参数控制,默认为 256 kb。当如果对一个索引字段进行排序的话,则不会使用额外的排序内存(也有可能是磁盘空间),因为索引本身是有序的。sort_buffer_size 的值越少,需要使用的外部空间越多。原创 2023-02-25 22:51:17 · 1364 阅读 · 0 评论 -
《MySQL学习》 count(*) 原理
每一行记录都要判断自己是否对这个会话可见,因此对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。对于 count(字段) 来说:如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。count(*) 肯定不是 null,按行累加。原创 2023-02-21 12:56:51 · 687 阅读 · 0 评论 -
《MySQL学习》 InnoDB 刷脏页机制
当要读入的数据不在当前内存页时,需要新读入一个内存页,而此时内存空间已经不足,需要淘汰最久不使用的数据页。如果被淘汰的是干净页,那么无事发现,如果是脏页,则需要先将脏页数据刷到磁盘上。当执行更新语句时,需要先将数据从磁盘读取到内存中,然后执行语句修改内存中的数据,再写 redo log日志,此时就会返回给客户端,更新成功。但此时的内存页与磁盘数据页内容是不一致的,需要将脏的内存页数据flush到磁盘上使之保持一致,这一过程称为刷盘,被刷盘后的内存页称为干净页,没有刷盘的内存页称为脏页。原创 2023-02-19 21:34:35 · 503 阅读 · 0 评论 -
《MySQL学习》 字符串字段添加索引技巧
如果使用普通索引,完全可以通过覆盖索引将数据返回给server层,而如果使用前缀索引,需要根据主键回表主键索引表去查询完整的email字段值,即使你将 前缀索引 的定义修改为 email(整个字段的长度) 的前缀索引,这时候虽然 index2 已经包含了所有的信息,但 InnoDB 还是要回到 id 索引再查一下,因为系统并不确定前缀索引的定义是否截断了完整信息。因此,可以建立前缀索引。除了前缀索引,其实我们还可以使用hash字段,新增一个整数字段,来保存身份证的校验码,同时在这个字段上创建索引。原创 2023-02-20 08:00:00 · 699 阅读 · 0 评论 -
《MySQL学习》 MySQL优化器选择如何选择索引
最初的SQL语句因为b不用排序,又有limit 1,从5w里只要找到一条就可以返回了,如果选择a,因为要排序,就要扫完1000条,然后才能排序,这成本明显太大,所以选择了b。但如果是limit 100,选择b,虽然不用排序,但找到第一条记录后,还要向后查询,看后面有没有满足条件的100个记录,从5w中找100个的成本就大于从1000找100个的成本了,所以选择a。要求按照b,a排序,无论选择b索引还是a索引,都只需要再将另外一个字段排序(个人认为索引b已经对b排好序,再对a排序;干扰order by判断。原创 2023-02-19 10:46:02 · 1188 阅读 · 0 评论 -
《MySQL学习》普通索引和唯一索引效率比较
当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性需要说明的是,虽然名字叫作 change buffer,实际上它是可以持久化的数据。原创 2023-02-18 23:37:54 · 1054 阅读 · 0 评论 -
《MySQL学习》 事务的隔离
事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。但是如果一个事务准备更新一行数据,而恰好另外一个事务也在更新这一行数据,造成阻塞等待,如果另外一个事务提交后,当前事务恢复后提交再次查询,值是否会变吗?CONSISTENT SNAPSHOT 开启事务,但执行了DML语句,将采用当前读,而事务C 在事务B执行update语句更改为2,首先事务B拿到当前读K的值为2,再加上1,最终查询结果为 3。原创 2023-02-17 13:40:25 · 303 阅读 · 0 评论 -
《MySql学习》 行锁对业务的影响
行锁由各个存储引擎分别实现,MyISAM存储引擎是不支持行锁的,这也是MySQL使用InnoDB作为默认存储引擎的一个重要原因,锁更细的InnoDB能支持更多的并发业务。但需要注意的是,行锁在InnoDB的实现是给索引加的锁,而不是记录。因此 使用update语句时,where条件后的字段需要建立索引,否则将使用的是表锁,因为没有索引让InnoDB去加上这个行锁,只有给整张表加上锁。原创 2023-02-16 13:29:26 · 574 阅读 · 0 评论 -
《MySQL学习》 全局锁和表锁
元数据锁是server层的锁,表级锁,主要用于隔离DML(Data Manipulation Language,数据操纵语言,如select)和DDL(Data Definition Language,数据定义语言,如改表头新增一列)操作之间的干扰。另外,最近重温操作系统时发现了一个免费精品好课,闪客的《Linux0.11源码趣读》,这个课给我感觉像在用看小说的心态学操作系统源码,写的确实挺牛的,通俗易懂,直指本源,我自己也跟着收获了很多。元数据锁 不需要显式使用,在访问一个表的时候会被自动加上。原创 2023-02-15 14:44:55 · 406 阅读 · 0 评论 -
《MySQL学习》 索引 下 覆盖索引,MRR,联合索引
有一个地方需要注意,虽然我们只获取到两条数据,但K只是一个普通索引,因此还需要再读取一条记录判断是否满足查询条件,因为下一条等于6已经不满足了,所有读取了三行记录,返回了两条记录。我们可以调整联合索引的顺序 改成 index_age_name,当使用age字段查询数据时,也是满足最左前置原则的,索引也是一种特殊的数据结构,也需要占用磁盘空间的,能少则少。由于我们需要的仅仅是ID字段,而id在二级索引上也是是作为叶子节点的数据存储的,因此是不需要再次回到一级索引查找数据。有一张表T1,它的建表语句如下。原创 2023-02-13 13:53:10 · 401 阅读 · 1 评论 -
《MySQL学习》 索引 上
MySQL索引的出现就是为了加快数据的查询效率,与字典的前几页目录一样,快速定位你需要的数据所在’页’;原创 2023-02-12 17:13:02 · 188 阅读 · 0 评论 -
《MySQL学习》 事务隔离 与 MVCC
事务保证一组数据要么全部成功要么全部失败,MySQL的事务基于引擎(如InnoDB)实现。原创 2023-02-10 11:18:33 · 401 阅读 · 0 评论 -
《MySql学习》 SQL 语句的更新过程
《MySql学习》 SQL 语句的更新过程一.SQL查询语句的执行过程 上一篇博文记录了SQL查询语句的执行过程,首先客户端通过TCP三次握手与Server层的连接器建立连接(短连接与长链接),缓存权限。然后去查询缓存(8.0后移除)中查询数据,如果有数据就直接将缓存数据返回(对表的DML,DDL操作都会使缓存失效)。如果没有命中缓存,来到分析器,对SQL语句进行词法分析与语法分析(表元数据信息不需要通过存储引擎获取)。如果SQL语句没有语法错误,且要查询的表与列都是存在的,将来到优化器进行优化(选择合原创 2023-02-09 16:24:11 · 448 阅读 · 0 评论 -
《MySql学习》 SQL 语句的执行过程
MySql 逻辑架构分为 Server层 与 engine 层其中 Server层 又分为 连接器,缓存,分析器,优化器,执行器 五部分engine 层 由不同的存储引擎组成。原创 2023-02-08 17:11:33 · 427 阅读 · 0 评论