![](https://img-blog.csdnimg.cn/20210709162438906.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
神奇的MySQL
文章平均质量分 95
从架构设计到底层实现,全面理解MySQL的存储引擎、执行流程以及性能调优
sermonlizhi
行百里者半九十
展开
-
慢查询日志文件
开启慢查询日志记录在MySQL中,慢查询日志的记录需要通过手动开启,可以在控制台通过set命令来设置,如下#开启慢查询日志set global slow_query_log='ON';#设置慢查询日志存放的位置set global slow_query_log_file='/user/local/mysql/data/slow.log'; //linixset global slow_query_log_file='D:\\mysql\data\show.log'; ..原创 2021-07-09 16:37:22 · 663 阅读 · 0 评论 -
MySQL索引基础
索引作为MySQL最为重要的组成部分,它通过将数据按照一定规则进行排序,形成一种特定的数据结构,从而加速数据的访问效率。一、索引数据结构索引数据结构通常有如下几种选择:二叉树、红黑树、Hash表、B树、B+树,这些数据结构都有各自的特性。二叉树二叉树是最普通的树结构,对结构平衡等都没有特别的实现,新增节点时只是按照已有树结构的排列顺序,比当前节点值大就放在右节点上,比当前节点值小就放在左节点上,通常二叉树的可以有如下结构:原创 2022-04-26 19:02:14 · 1441 阅读 · 0 评论 -
Explain使用详解
在日常开发工作中,对于SQL的书写,通常都会尽量让SQL能够使用到表中创建的索引,以此来提高SQL语句的性能。想要参看一个SQL是否会使用索引,可以使用MySQL字段的分析工具Explain,这篇文章重要介绍该工具的使用。一、 简介使用Explain关键字可以模拟优化器执行SQL语句,进而分析查询语句或结构的性能瓶颈。在SQL语句之前增加Explain关键字,MySQL会设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。注:如果from中包含了子查询,仍会执行该子查询,将结果放入到临时原创 2022-04-27 16:08:48 · 3415 阅读 · 1 评论 -
MySQL索引使用准测
SQL语句中使用索引,是需要遵守一些准则的,否则极有可能导致索引失效,这篇文章主要就是介绍索引使用过程的一些注意事项。一、数据准备建立一张员工表:DROP TABLE IF EXISTS employees;CREATE TABLE employees ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', age int(11) NOT NULL DEFAULT '原创 2022-04-27 17:42:07 · 913 阅读 · 1 评论 -
SQL执行流程与Binlog
MySQL中,一条语句的执行要经过很多个步骤才能完成,MySQL将这些步骤分为两个大的部分:Server层和存储引擎层,其中Server层负责SQL语法解析、优化,然后调用存储引擎的查询接口,而存储引擎只需要提供统一的入口即可。内部组件如下:通过这种图,我们来具体分析MySQL中一条SQL的执行过程。一、Server层Server层主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都原创 2022-04-28 19:44:20 · 1296 阅读 · 1 评论 -
索引优化(一)
对于任何一个后端的开发人员来说,索引优化是必备的技能,接下来会通过两篇文章来介绍如何优化索引以及如何设计好的索引。一、数据准备创建一个员工表,除了主键索引外,还额外创建了联合索引idx_name_age_positionDROP TABLE IF EXISTS employees;CREATE TABLE employees ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(24) NOT NULL DEFAULT '' COMMENT '原创 2022-04-29 17:49:06 · 913 阅读 · 0 评论 -
索引优化(二)
在上一篇《索引优化(一)》的文章中,已经介绍了联合索引、索引下推、排序分组和文件排序的优化策略,还介绍了如果通过trace工具来查看MySQL选择执行方案的过程,这边文章继续介绍常用的索引优化以及如何设计索引。一、分页查询优化很多时候,业务系统需要实现分页展示的功能,可能会用到下面的SQL:select * from employees limit 10000,10;该SQL从表中取出从10001开始的10条数据。虽然从结果看是只查询了10条数据,但实际上这条SQL是先读取10010条记录,然后抛原创 2022-04-30 10:29:56 · 570 阅读 · 0 评论 -
浅谈事务隔离级别与锁机制
数据库中通常会存在并发执行多个事务的情况,而这些并发的事务如果操作的有相同的数据,就会导致脏写、脏读等问题。MySQL为了解决数据库并发事务导致的脏写、脏读、不可重复读、幻读等问题,设计了事务隔离等级、锁机制和MVCC(多版本并发控制)机制,通过一整套的机制来解决多事务并发问题。一、数据库事务1.1 事务特性事务是由一组SQL语句组成的逻辑处理单元,事务具有以下四大特性,称为事务的ACID特性:原子性:事务是一个原子操作单元,其内部的SQL语句要么全部执行成功,要么都不执行一致性:在事务开始和完原创 2022-05-01 17:00:47 · 1555 阅读 · 1 评论 -
MVCC机制与Buffer Pool
在上一篇文章《事务隔离级别与锁机制》中介绍了,读已提交和可重复度隔离级别都用到了MVCC机制,MySQL在可重复读的事务隔离级别下,可以解决数据的不可重复读问题,就算其他事务对访问的数据进行了修改,也不影响当前事务两次读取的结果。而这个隔离性就是由**MVCC(Multi-Version Concurrency Control)**机制来保证的,对一行数据的读写操作不要进行加锁就可以保证隔离性,达到了一致性非锁定读的效果。注:MySQL在读已提交和可重复读两种事务隔离级别下都实现了MVCC机制这篇文章就原创 2022-05-01 18:42:26 · 737 阅读 · 0 评论 -
表结构及索引设计
良好的表结构设计是高性能的基础,要根据系统将要执行的业务来设计,需要权衡多种因素。但在数据库设计上,有个非常重要的设计准则,称为范式设计。这篇文章将介绍数据库表设计中的范式和反范式设计以及索引的深度辨析和索引创建的策略。一、范式设计在关系型数据库中,想要设计好表之间的关系,就需要使关系满足一定的约束条件,而这些约束条件就是数据库设计中的范式,数据库设计的范式分为多个等级,每一个等级都是在上一个等级上的延申。目前关系型数据库分为六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯原创 2022-05-01 21:25:04 · 966 阅读 · 0 评论 -
MySQL内核查询成本计算
在《索引优化(一)》的文章中,提到可以通过trace工具来查看MySQL是如何选择索引的。使用方式:set session optimizer_trace="enabled=on",end_markers_in_json=on;select * from employees where name > 'lizhi' order by position;SELECT * FROM information_schema.OPTIMIZER_TRACE;在选择索引的过程中,最重要的指标就是查询成原创 2022-05-01 23:12:20 · 1057 阅读 · 0 评论 -
MySQL索引合并
MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但存在有特殊情况,也可能在一个查询中使用到多个二级索引,MySQL中这种使用到多个索引来完成一次查询的执行方法称之为:索引合并/index merge在上一篇文章《MySQL内核查询成本计算》中提到,会先分析单独使用这些索引的成本,最后还要分析是否可能使用到索引合并。而使用索引合并的前提条件是要满足既定的一些规范,其中就包括下面三种:一、Intersection合并Intersection是交集的意思。某个查询可以使用多个二级索引,将从多原创 2022-05-02 10:44:45 · 2401 阅读 · 0 评论 -
优化器内部优化规则
在前面介绍Explain使用的文章《Explain使用详解》中,简单的提到了show warnings的使用,通过该语句可以查看一条SQL经过优化器处理后,真正要执行的SQL是什么样子。这篇文章就介绍一些MySQL优化器内部优化的规则,对于开发人员来说,了解MySQL内部的优化规则可以让优化工作在书写SQL时就完成,不需要优化器再帮忙优化,这样也可以提升SQL执行的效率。对于一个SQL的执行,MySQL在执行的过程中会有很多的优化措施,比如索引下推、回表中的MRR、索引合并等等。这里主要介绍三大类优化原创 2022-05-02 12:14:36 · 983 阅读 · 0 评论 -
InnoDB存储结构
InnoDB存储引擎是为数据页为操作的基本单位,默认大小为16KB,而这些数据页是存储在磁盘中,当需要查询数据时,InnoDB怎么知道每条记录放在磁盘的哪个位置,这里面就涉及到了InnoDB记录的存储存储结构、索引页结构以及表空间等,这篇文章主要就是介绍记录是怎么存储在磁盘中,除了记录业务数据外,还需要记录哪些内容。一、InnoDB记录存储结构我们平时在使用数据库时,是以记录为单位读取或修改数据,这些记录在磁盘上的存放方式称为行格式或记录格式。InnoDB存储引擎设计了四种不同类型的行格式,分别是:Co原创 2022-05-02 19:10:16 · 2540 阅读 · 0 评论 -
详解InnoDB的Buffer Pool
在上一篇文章《InnoDB存储结构》中,可以从InnoDB的体系结构中看到InnoDB存储引擎主要包含两部分内容,其中表空间结构这些在该文章已经介绍了,而这篇文章将会重点介绍Buffer Pool。一、简介InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起原创 2022-05-03 14:26:43 · 2368 阅读 · 0 评论 -
详解Redo log与Undo log
深度剖析Redo log与Undo log的作用原创 2022-05-03 15:54:14 · 15699 阅读 · 6 评论