
【MySQL深度剖析】
文章平均质量分 97
探索Mysql索引数据结构、Mysql执行计划与索引使用最佳实践、SQL底层执行原理详解、SQL索引优化、Mysql锁与事务隔离级别、MVCC底层原理与Mysql日志等大厂必备技能
小小工匠
show me the code ,change the world
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
MySQL - 写多读少的场景下如何优化数据存储方案
但它依然不能解决某一个业务的数据大量膨胀的问题,一旦系统中的某一个业务库的数据量剧增,比如商品系统接入了一个大客户的供应链,对于商品数据的存储需求量暴增,在这个时候,就要把数据拆分到多个数据库和数据表中,也就是对数据做水平拆分。单机性能总是有极限的,互联网分布式架构设计高并发终极解决方案还是水平扩展,所以结合业务的特性,就需要在 Range 的基础上引入“分片元数据”的概念:分片的规则记录在一张表里面,每次执行查询的时候,先去表里查一下要找的数据在哪个分片中。垂直拆分是根据数据的业务相关性进行拆分。原创 2025-04-01 07:30:00 · 2636 阅读 · 0 评论 -
MySQL - 读多写少场景下的优化数据查询方案
如果客户端将要执行的命令发送给集群中的一台服务器,那么这台服务器就会以日志的方式记录这条命令,然后将命令发送给集群内其他的服务,并记录在其他服务器的日志文件中,注意,只要保证各个服务器上的日志是相同的,并且各服务器都能以相同的顺序执行相同的命令的话,那么集群中的每个节点的执行结果也都会是一样的。,介于两者之间,事务线程不用等待所有的从库复制成功响应,只要一部分复制成功响应回来就行,比如一主二从的集群,只要数据成功复制到任意一个从库上,主库的事务线程就可以返回给客户端。所以这种方式不是 MySQL 特有的。原创 2025-04-01 05:00:00 · 2915 阅读 · 0 评论 -
MySQL - 事务隔离级别和锁的机制
假设有 A 和 B 两个事务,在并发情况下,事务 A 先开始读取商品数据表中的数据,然后再执行更新操作,如果此时事务 A 还没有提交更新操作,但恰好事务 B 开始,然后也需要读取商品数据,此时事务 B 查询得到的是刚才事务 A 更新后的数据。换句话说,事务 A 操作数据库时,事务 B 只能排队等待,因此性能也最低。循环等待:可以靠按序申请资源来预防,也就是所谓的资源有序分配原则,让资源的申请和使用有线性顺序,申请的时候可以先申请资源序号小的,再申请资源序号大的,这样的线性化操作就自然就不存在循环了。原创 2025-03-31 22:17:21 · 2359 阅读 · 0 评论 -
MySQL - 索引原理与优化:深入解析B+Tree与高效查询策略
优秀的索引设计需要平衡查询效率与写入性能。优先考虑最常用查询模式单表索引不超过5个联合索引字段数不超过3个定期审查索引使用情况通过理解B+Tree的底层原理,结合执行计划分析与实际业务场景,开发者可以构建出高效的数据访问方案。记住:没有最好的索引,只有最适合业务场景的索引设计。原创 2025-03-31 05:15:00 · 2691 阅读 · 0 评论 -
MySQL - order by 出现 using filesort根因分析及优化
文章目录PreCasePreMySQL - order by和 group by 优化初探CaseCREATE TABLE `user` ( `id` int(10) AUTO_INCREMENT, `user_id` int(10), `gf_phone` varchar(1000), `gf_name` varchar(100), PRIMARY KEY (`id`), KEY `user_id` (`user_id`)) ENGINE=InnoDB;原创 2021-11-08 19:46:25 · 30016 阅读 · 4 评论 -
MySQL - 库表设计之IP和TIMESTAMP的处理
文章目录PreTIMESTAMPIP总结PreMySQL - 高效的设计MySQL库表设计指导思想和注意事项都梳理了一下,那来个小练习把TIMESTAMP我们使用 MySQL 内置的函数(FROM_UNIXTIME(),UNIX_TIMESTAMP()),可以将日期转化为数字,用 INT UNSIGNED 存储日期和时间示例时间 2020-08-17 22:22:22 与整数之间的转换,转化后数字是连续的,占用空间更小,并且可以使用索引提升查询性能。mysql> select U原创 2020-08-17 22:29:56 · 16393 阅读 · 2 评论 -
MySQL - 高效的设计MySQL库表
文章目录范式与反范式范式第一范式第二范式第三范式第二范式 VS 第三范式设计符合 2NF 的表范式优缺点反范式范式与反范式范式范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。数据库的设计范式是数据库设计所需要满足的规范。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的叫第一范式,简称 1NF。在第一范式基础上进一步满足一些要求原创 2020-08-16 21:42:15 · 22059 阅读 · 12 评论 -
MySQL - 锁机制初探
文章目录Pre锁的分类InnoDB 中的锁行锁InnoDB 行锁的三种算法实现表锁InnoDB 自增锁InnoDB 锁关系矩阵InnoDB 锁问题排查思路PreMySQL - 解读MySQL事务与锁机制MySQL - 共享锁和排它锁初探MySQL - 无索引行锁升级为表锁MySQL - 锁等待及死锁初探锁的分类在 MySQL 中有三种级别的锁:页级锁、表级锁、行级锁表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 会发生在:MyISAM、memor原创 2020-08-11 21:12:08 · 16726 阅读 · 0 评论 -
MySQL - 并发事务问题及解决方案
文章目录Pre脏读不可重复读幻读SolutionsPreMySQL - 多版本控制 MVCC 机制初探中我们初步了解了 MVCC 的原理及其实现。 随着数据库并发事务处理能力的增强,数据库资源的利用率也会大大提高,从而提高了数据库系统的事务吞吐量,可以支持更多的用户并发访问。但并发事务处理也会带来一些问题,如:脏读、不可重复读、幻读等等脏读一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了原创 2020-08-10 20:49:47 · 18556 阅读 · 1 评论 -
MySQL - 多版本控制 MVCC 机制初探
文章目录MVCC原理快照读与当前读MVCC 多版本实现MVCC原理MySQL InnoDB 存储引擎,实现的是基于多版本的并发控制协议——MVCC,而不是基于锁的并发控制。MVCC 最大的好处是读不加锁,读写不冲突。在读多写少的 OLTP(On-Line Transaction Processing)应用中,读写不冲突是非常重要的,极大的提高了系统的并发性能。快照读与当前读在 MVCC 并发控制中,读操作可以分为两类: 快照读(Snapshot Read)与当前读 (Current Read)。原创 2020-08-10 19:45:22 · 16446 阅读 · 0 评论 -
MySQL - 解读MySQL事务与锁机制
文章目录事务及其特性一致性原子性隔离性持久性并发事务控制单版本控制-锁多版本控制-MVCC原子性背后的技术持久性背后的技术隔离性背后的技术一致性背后的技术MVCC原理快照读与当前读MVCC 多版本实现事务及其特性大家都知道 ACID (原子性、一致性、隔离性和持久性)一个逻辑工作单元要成为事务,在关系型数据库管理系统中,必须满足 4 个特性原子性 : 事务的所有操作,要么全部完成,要么全部不完成,不会结束在某个中间环节一致性 : 事务开始之前和事务结束之后,数据库的完整性限制原创 2020-08-10 00:37:11 · 16574 阅读 · 0 评论 -
MySQL - 体系结构初探
文章目录数据库MySQL 数据库的体系结构数据库根据数据库的类型或者功能或者数据库的发展方向,可以把数据库大致分成两类关系型数据库非关系性数据库,或者叫 SQL 和 NoSQL当然了关系型数据库又可以分为传统的关系型数据库和 NewSQLMySQL 数据库的体系结构...原创 2020-08-09 21:50:37 · 16055 阅读 · 0 评论 -
MySQL - 存储引擎初探
文章目录存储引擎概述存储引擎概述存储引擎是 MySQL 中具体与文件打交道的子系统,它是根据 MySQL AB 公司提供的文件访问层抽象接口定制的一种文件访问机制,这种机制就叫作存储引擎 。常用的存储引擎:有古老的 MyISAM、支持事务的 InnoDB、内存类型的 Memory、归档类型的 Archive、列式存储的 Infobright,以及一些新兴的存储引擎,以 RocksDB 为底层基础的 MyRocks 和 RocksDB,和以分形树索引组织存储的 TokuDB, 以及国产的分布式存储引原创 2020-08-09 22:44:30 · 16106 阅读 · 1 评论 -
MySQL- In 和 Exists的优化案例讲解
文章目录Demo Tablein的逻辑优化原则exists的逻辑Demo TableCREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_a` (`a`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;create table原创 2020-08-08 23:20:11 · 16581 阅读 · 0 评论 -
MySQL - Join关联查询优化 --- NLJ及BNL 算法初探
mysql的表关联常见有两种算法Nested-Loop Join 算法Block Nested-Loop Join 算法原创 2020-08-08 16:47:17 · 17955 阅读 · 0 评论 -
MySQL - 分页查询优化的两个案例解析
文章目录Table日常场景Table还是我们那个老表CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄', `position` varchar(20) NOT NULL DEFAULT '' COMMENT原创 2020-08-08 09:10:31 · 16511 阅读 · 3 评论 -
MySQL - order by和 group by 优化初探
文章目录DB VersionTable案例一DB Versionmysql> select version();+-----------+| version() |+-----------+| 5.7.28 |+-----------+1 row in setmysql> TableCREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) N原创 2020-08-03 17:09:03 · 16703 阅读 · 0 评论 -
MySQL - 使用trace工具来窥探MySQL是如何选择执行计划的
文章目录Pre演示Demotrace工具使用Trace结论分析Pre有的时候,明明某个字段有索引,那我们一般认为走索引好一些,结果mysql走了全表扫描 , 那怎么看mysql是怎么选择的呢? 来 今天来看一看MySQL是如何循着合适的执行计划的?演示Demo还是那个老表 employeesCREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DE原创 2020-08-03 01:18:42 · 17582 阅读 · 0 评论 -
MySQL - 索引下推 Index Condition Pushdown 初探
文章目录PreICP索引下推的含义范围查找为啥不行?PreMySQL - 索引优化案例实操 中 关于 【Case 3 : like KK% 一般情况都会走索引】 ,我们来详细聊一聊ICP我们说like KK% 一般情况下会走索引,这是为何呢? 结合B+索引树, like KK% 能保证有序吗?其实MySQL对like KK% 这种情况使用到了索引下推优化 Index Condition Pushdown,ICP索引下推的含义CREATE TABLE `employe原创 2020-08-03 00:08:32 · 17025 阅读 · 3 评论 -
MySQL - 索引优化案例实操
文章目录DB VersionTableDB Versionmysql> select version();+------------+| version() |+------------+| 5.7.29-log |+------------+1 row in set默认隔离级别 RR 可重复读TableCREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar原创 2020-08-02 22:57:31 · 16856 阅读 · 0 评论 -
MySQL - 共享锁和排它锁初探
文章目录共享锁 vs 排他锁SELECT ... FOR UPDATE 排它锁SELECT ... LOCK IN SHARE MODE 共享锁共享锁 vs 排他锁锁定某一行还可以用lock in share mode(共享锁) 和for update(排它锁)SELECT … FOR UPDATE 排它锁对所在行加上了一把排它锁 x锁【实验步骤】session1session2begin 模拟开启事务select * from countr原创 2020-08-02 20:29:44 · 17850 阅读 · 3 评论 -
MySQL - 无索引行锁升级为表锁
文章目录示例SELECT ... LOCK IN SHARE MODE & SELECT ... FOR UPDATE示例mysql> desc country;+-------------+--------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------------+---原创 2020-07-31 19:31:19 · 17928 阅读 · 2 评论 -
MySQL - 锁等待及死锁初探
版本信息mysql> select version();+-----------+| version() |+-----------+| 5.7.28 |+-----------+1 row in setmysql> MySQL 行锁分析mysql> show status like'innodb_row_lock%';+-------------------------------+--------+| Variable_name .原创 2020-07-31 15:14:05 · 18752 阅读 · 2 评论 -
MySQL - 践行索引优化
文章目录PreTable DemoPreMySQL - Explain深度剖析Table DemoCREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄', `position` varchar(20) NOT原创 2020-07-21 23:15:46 · 16419 阅读 · 4 评论 -
MySQL - Explain深度剖析
文章目录官方文档Explain介绍测试数据官方文档https://dev.mysql.com/doc/refman/5.7/en/explain-output.htmlExplain介绍使用EXPLAIN关键字可以模拟优化器执行SQL语句,分查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 。测试数据原创 2020-07-20 23:08:53 · 16808 阅读 · 0 评论 -
MySQL - MySQL不同存储引擎下索引的实现
文章目录PreMyISAM索引实现非聚簇(非聚集)索引索引原理图InnoDB索引实现聚簇(聚集)索引索引原理图为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)PreMySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,我们这里主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。MyISAM索引实现非聚簇(非聚集)索引我们建立一个myIsam存储引擎的表,看磁盘上的文件存储如下我这个是8.0的MYSQL, 5.7版本 不是sdi结尾的文原创 2020-07-19 17:08:42 · 17231 阅读 · 1 评论 -
MySQL - 剖析MySQL索引底层数据结构
文章目录PrePre什么是索引?通俗的说就是为了提高效率专门设计的一种 排好序的数据结构。怎么理解呢?举个例子哈如上数据 ,假设有个SQLselect * from t where col2 = 22 ;原创 2020-07-18 16:51:14 · 17662 阅读 · 1 评论