mysql
文章平均质量分 79
三易的博客
能动手就别哔哔
展开
-
事务是怎样工作的
目录事务特性事务隔离性解决什么问题隔离级别事务隔离实现原理可重复读隔离级别的实现原理知识铺垫InnoDB中的事务ID数据的多版本(MVCC)InnoDB 为每个事务构造了一个由事务ID组成的数组一致性视图(read-view)举例:可重复读的事务隔离级别工作原理问答问:回滚日志不会一直保留,什么时候删除问:为什么尽量不要使用长事务问:如何正确的开启事务问:哪些操作会导致长事务,或者说如何避免长事务问:如何查询数据库当前所有的事务事务特性原创 2021-09-03 08:36:16 · 217 阅读 · 0 评论 -
join 是怎样工作的
目录数据准备Index Nested-Loop Join(NLJ)(扫描被驱动表用到索引)Block Nested-Loop Join(BNL)(扫描被驱动表未用到索引)假设 join bufer 足够大实际中 join buffer 是有限制的如何选择驱动表走索引的情况不走索引的情况文中“小表”的含义举例1举例2举例3结论Multi-Range Read(MRR)Batched Key Access(BKA)BNL 算法的性能问题数据准备原创 2021-09-02 08:21:51 · 183 阅读 · 0 评论 -
group by 是怎样工作的
数据准备CREATE TABLE `t2` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_a` (`a`)) ENGINE=InnoDB;在表 t2 中插入数据 100 条数据for(int i=1; i<=100; i++) { insert into t2(id, a, b) values原创 2021-08-31 23:10:25 · 209 阅读 · 0 评论 -
order by 是怎样工作的
一图胜千言rowid排序排序的时候,只将 order by 后面排序字段以及记录主键放入到 sort buffer 中。比如 select a,b,c from t order by a desc,只将字段a,表主键id 放入 sort buffer 中全字段排序排序的时候,将select sql中所有字段都放入到 sort buffer 中一起参与排序,无需根据rowid 再去主键索引上获取记录。比如 select a,b,c from t order by a desc,只将原创 2021-08-29 19:36:35 · 194 阅读 · 0 评论 -
innodb存储引擎之:索引的数据结构
什么是 目录项每个页对应一个目录项,每个目录项包括下面两个部分页的用户记录中最小的主键值,用 key 来表示 页号,用 page_Do 表示主键索引结构示意图二级索引结构示意图联合索引结构示意图InnoDB 中 B+ 树索引的注意事项根节点千年不动窝一个 B+ 树索引的根节点自创建之日起便不会再移动(也就是页号不再改变)。这样只要我们对某个表建立一个索引 ,那么它的根节点的页号便会被记录到某个地方,后续凡是 InnoDB 存储引擎需要用到这个索原创 2021-08-26 23:25:49 · 145 阅读 · 0 评论 -
更详细的执行计划 optimizer_trace
目录数据准备查看 optimizer_trace数据准备CREATE TABLE `t2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11), `b` int(11), `c` varchar(16) , `create_time` datetime, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;插入数据for(int i=1; i&原创 2021-08-26 23:21:00 · 199 阅读 · 0 评论 -
mysql是如何选择索引的(为什么会选错索引)
什么是查询成本查询成本 = I/O成本 + CPU成本I/O 成本:将数据从磁盘加载到内存的损耗时间称为 I/O 成本(对 memory 引擎的表除外,使用与磁盘性的存储引擎,例如 myisam,innodb)CPU成本:读取记录,检测记录是否满足条件,对结果集进行排序等这些操作的损耗时间称为 CPU 成本对Innodb 存储引擎来说,读取一个数据页花费的成本默认是 1.0;读取记录、检测记录是否满足条件成本默认是 0.2。这里说的 “1.0” “0.2”,在mysql中是可以设置的原创 2021-08-26 23:12:24 · 362 阅读 · 0 评论 -
innodb存储引擎之:innodb buffer pool
目录缓冲页缓冲页的控制块缓冲页的哈希表free 链表flush 链表LRU 链表从 innodb buffer pool 看 select 语句的执行过程多个 innodb buffer pool 实例innodb_buffer_pool_chunk_size查看 innodb buffer pool 状态信息小小的扩展点问答:缓冲页innodb buffer pool 将一块连续的内存划分成了,大小固定的缓冲页。一个缓冲页保存这一个数据页上的所有数据原创 2021-08-25 21:20:32 · 293 阅读 · 0 评论 -
innodb存储引擎之:表空间
概览https://www.mubucm.com/doc/5X-MdVzKDKB为什么innodb设计了“区”的概念如果以页为单位来分配存储空间,B+树索引中同一层级的双向链表相邻的两个页之间的物理位置可能离得非常远,会导致遍历索引的时候,无法使用顺序I/O,所以引入了“区”的概念为什么innodb设计了“碎片区”的概念如果有些表的本身的记录数很少,例如业务配置类型的表,直接以“区”为单位分配存储空间,就会导致磁盘空间的浪费。所以mysql规定,当一个表占用的页数量超过.原创 2021-08-24 12:52:40 · 253 阅读 · 0 评论 -
innodb 存储引擎之:记录的数据结构,数据页的数据结构
目录innodb 行格式COMPACT 行格式记录的额外信息变长字段长度列表NULL值列表记录的头信息记录的真实数据innodb数据页结构示意图File HeaderPage Header(页头部)lnfimum + SupremumUser RecordsFree SpacePage Directory(页目录)File Trailer一个数据页的示意图innodb 行格式innodb 有4中不同类型的行格式,分别是COMPACT原创 2021-08-23 23:32:46 · 182 阅读 · 0 评论 -
memory 存储引擎
目录memory 引擎memory 表结构示意图memory表的特点在memory表上创建 B-Tree 索引为什么不建议在生产环境使用 memory 引擎的表锁粒度数据持久化问题主从数据同步问题在双M高可用架构中,更诡异的现象memory 引擎memory 表结构示意图memory表的特点Memory 引擎的数据和索引是分开的 内存表的数据部分以数组的方式单独存放,而主键 id 索引里,存的是每个数据的位置(数组的下标)。主键 id 是 has原创 2021-08-23 23:05:10 · 459 阅读 · 0 评论 -
mysql 逻辑架构图概览
逻辑架构图Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。连接器管理链接,权限验证 校验.原创 2021-08-23 13:16:57 · 248 阅读 · 1 评论