
MySQL专栏讲解
文章平均质量分 90
从各个不同的层面,切入数据库了解MySQL的各种底层逻辑,增加对于MySQL的兴趣;
易安杰
自由就是乐此不疲
展开
-
7、join语句执行原理,如何优化join语句?
另一种做法是一个表中的有上百万条数据,但是经过where条件过滤后,参加join语句的只有2000条数据,同时这条语句还是个低频的SQL语句,那在这个字段上面创建索引就有些浪费了,可以通过创建临时表,将原表中需要参加join语句的数据放在临时表中,给临时表中的字段加一个索引,主要目的就是可以触发BKA算法,提升性能;在这个查询语句中,staight_join语句的作用是强制MySQL按照from自居中的表顺序进行连接,而不是由优化器决定连接顺序,在这个语句中t1是驱动表,t2是被驱动表;原创 2025-02-12 13:35:37 · 707 阅读 · 0 评论 -
6、count(*)的实现方式,count(*)业务优化
首先需要注意的是随着表数据越来越多,count(*)的执行速度会越来越慢,而在业务中一个数据量很大的表,说明这个表的利用率还是较高的,而这时候count(*)这中统计的语句执行效率慢会大大影响业务的并发性能;count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。在同一时间对于不同的统计操作,查出来的数据是不一样的,主要是因为MySQL的隔离级别是可重复读,在代码上通过MVCC机制判断对于当前对话是否可见;原创 2025-02-10 11:05:24 · 528 阅读 · 0 评论 -
5、MySQL的全局锁、表锁和行锁,如何解决并发问题?
上图中的MDL锁,sessionA在给表t申请读锁,sessionB也能够申请表t的读锁,在sessionC要申请写锁时,会被阻塞等待前面的读锁释放,sessionD在申请读锁时,由于sessionC被阻塞了,导致sessionD的读锁也需要等待;如果要拿到一致性视图,可以使用可重复读的隔离级别(详见:3、事务的特性讲解,ACID之事务隔离)在这个隔离级别中通过创建事务,保证拿到的数据是一致的,同时还要确保当前的存储引擎支持事务,像对于MyISAM存储引擎就不支持事务;一种策略是,直接进入等待,直到超时。原创 2025-02-05 10:04:20 · 623 阅读 · 0 评论 -
4、深入浅出索引——MySQL最重要的概念之一
B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护;在建表语句中,针对自增主键的建表语句通常是这么定义的:NOT NULL PRIMARY KEY AUTO_INCREMENT,这种情况下不会造成叶子节点的分裂;(当在插入新数据时,当前数据页的数据满了,需要申请新的数据页,再挪一部分数据过去,这就称为页分裂,不光影响性能,还会影响数据页的利用率,下降在50%左右),这种情况下,每次插入数据都是追加操作,不会产生页分裂;有时有业务逻辑的字段做主键就不能保证有序插入,这样写数据的成本就会增大;原创 2025-01-25 16:48:37 · 1039 阅读 · 0 评论 -
3、事务的特性讲解,ACID之事务隔离
本节主要介绍的是其中“I”隔离性,而隔离性主要涉及的就是隔离级别也称为 RU 级别。允许事务读取未被其他事务提交的数据。存在脏读(Dirty Read)的问题,即一个事务可能读取到另一个事务尚未提交的数据,如果那个事务最终回滚,则读取的数据是不正确的。也称为 RC 级别。确保事务只能读取已经被其他事务提交的数据。原创 2025-01-23 16:08:47 · 726 阅读 · 0 评论 -
2、MySQL的日志系统(Redo log、Binary log),SQL更新语句的执行流程?
它是 Write-Ahead Logging (WAL) 实现的一部分,用于记录对数据库所做的所有更改,Redo Log是InnoDB引擎特有的日志文件,并且无法持久保存(WAL是一种确保数据完整性和恢复能力的技术,其原理就是在实际修改数据页之前,先将数据统一写入日志文件(这里的日志文件就是Redo log))然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。原创 2025-01-23 14:47:21 · 798 阅读 · 0 评论 -
1、鸟瞰MySQL数据库,SQL查询语句是如何执行的?
大体来说,MySQL可以分为server层和存储引擎层(MySQL逻辑架构图)原创 2025-01-22 16:36:47 · 1234 阅读 · 0 评论