mysql执行计划

MySQL锁详解

◇◆丶佛笑我妖孽 提交于 2019-12-15 08:57:13
MySQL锁详解 一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 1.表级锁定(table-level) 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。 使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 2.行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小

神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一)

…衆ロ難τιáo~ 提交于 2019-12-15 06:51:31
问题背景   对于 MySQL 的 JOIN,不知道大家有没有去想过他的执行流程,亦或有没有怀疑过自己的理解(自信满满的自我认为!);如果大家不知道怎么检验,可以试着回答如下的问题: 驱动表的选择 MySQL 会如何选择驱动表,按从左至右的顺序选择第一个? 多表连接的顺序 假设我们有 3 张表:A、B、C,和如下 SQL -- 伪 SQL,不能直接执行 A LEFT JOIN B ON B.aId = A.id LEFT JOIN C ON C.aId = A.id WHERE A.name = '666' AND B.state = 1 AND C.create_time > '2019-11-22 12:12:30' 是 A 和 B 联表处理完之后的结果再和 C 进行联表处理,还是 A、B、C 一起联表之后再进行过滤处理 ,还是说这两种都不对,有其他的处理方式 ? ON、WHERE 的生效时机 楼主无意之间逛到了一篇博文,它里面有如下介绍 正经图1 摘自 Mysql - JOIN详解 看完这个,楼主第一时间有发现新大陆的感觉,原来 JOIN 的执行顺序是这样的(不是颠覆了楼主之前的认知,因为楼主之前就没想过这个问题,而是有种新技能获取的满足),可后面越想越不对,感觉像是学错了技能(6级没学大!)      如果两表各有几百上千万的数据,那这两张表做笛卡尔积,结果不敢想象

索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!

落爺英雄遲暮 提交于 2019-12-14 09:32:08
前言 Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结。自上上篇写了 手动搭建Redis集群和MySQL主从同步(非Docker) 和上篇写了 动手实现MySQL读写分离and故障转移 之后,索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家。 这篇博客我会谈谈对于索引结构我自己的看法,以及分享如何从零开始一层一层向上最终理解索引结构。 从一个简单的表开始 create table user( id int primary key, age int, height int, weight int, name varchar(32) )engine = innoDb; 相信只要入门数据库的同学都可以理解这个语句,我们也将从这个最简单的表开始,一步步地理解MySQL的索引结构。 首先,我们往这个表中插入一些数据。 INSERT INTO user(id,age,height,weight,name)VALUES(2,1,2,7,'小吉'); INSERT INTO user(id,age,height,weight,name)VALUES(5,2,1,8,'小尼'); INSERT INTO user(id,age,height,weight,name)VALUES(1,4,3,1,'小泰'); INSERT INTO user(id

面试必备的10道MySQL题

a 夏天 提交于 2019-12-14 07:23:55
MySQL 事务,是我们去面试中高级开发经常会被问到的问题,很多人虽然经常使用 MySQL,SQL 语句也写得很溜,但是面试的时候,被问到这些问题,总是不知从何说起。下面我们先来了解一下什么是 MySQL事务,再给大家分享10道面试必备的MySQL题。 MySQL事务是数据处理的最小操作单元,是一组不可在分割的操作集合,这个操作单元里的一系列操作要么都成功,要么都失败。 1、MySQL主从复制的原理。 (1)、主库必须开启二进制日志 (2)、当有增删改的语句时,会记录到主库的binlog中 (3)、主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)(这是msyql复制是异步复制的原因) (4)、从库的sql线程负责读取它的relay log里的信息并应用到数据库中 2、Seconds_Behind_Master的原理。 表示sql线程和io线程之间的时间差 具体的计算:从库服务器当前的时间戳与二进制日志中的事件的时间戳相对比得到的,所以只有在执行事件时才能报告延迟。 不足: 一些错误(例如主备的max_allowed_packet不匹配,或者网络不稳定)可能中断复制,由于主从复制是异步操作,Seconds_Behind_Master可能显示为0 3、主从延迟的主要原因有哪些? (1)、慢SQL语句过多 (2)、从库的硬件比主库差 (3)

阿里系统研发部数据库组教你一文搞懂 MySQL 单表查询的底层实现

女生的网名这么多〃 提交于 2019-12-14 04:26:30
记得给我点个关注哦,每天都会分享Java有关的文章 前言: 对于我们这些 MySQL的使用者来说,平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化,如果连查询是怎么执行的都不清楚还优化个毛线,所以是时候掌握真正的技术了。 MySQL有一个称为 查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。不过查询优化这个主题有点儿大,在学会跑之前还得先学会走,所以本章先来瞅瞅 MySQL怎么执行单表查询(就是 FROM子句后边只有一个表,最简单的那种查询~)。 为了故事的发展,先得有个表: 我们为这个 single_table表建立了1个聚簇索引和4个二级索引,分别是: 为 id列建立的聚簇索引。 为 key1列建立的 idx_key1二级索引。 为 key2列建立的 idx_key2二级索引,而且该索引是唯一二级索引。 为 key3列建立的 idx_key3二级索引。 为 key_part1、 key_part2、 key_part3列建立的 idx_key_part二级索引,这也是一个联合索引。 然后我们需要为这个表插入10000行记录,除

MySQL面试题看这一篇就够了

a 夏天 提交于 2019-12-14 00:05:12
现在mysql相关的面试,面试官总会问一些相关的技术问题。在这里,因此就总结一些常见的mysql面试题,都是自己平时工作的总结以及经验。希望大家看完,能避开”面试坑”。 1、MySQL主从复制的原理。 (1)、主库必须开启二进制日志 (2)、当有增删改的语句时,会记录到主库的binlog中 (3)、主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)(这是msyql复制是异步复制的原因) (4)、从库的sql线程负责读取它的relay log里的信息并应用到数据库中 2、Seconds_Behind_Master的原理。 表示sql线程和io线程之间的时间差 具体的计算:从库服务器当前的时间戳与二进制日志中的事件的时间戳相对比得到的,所以只有在执行事件时才能报告延迟。 不足: 一些错误(例如主备的max_allowed_packet不匹配,或者网络不稳定)可能中断复制,由于主从复制是异步操作,Seconds_Behind_Master可能显示为0 3、主从延迟的主要原因有哪些? (1)、慢SQL语句过多 (2)、从库的硬件比主库差 (3)、同一个主库下有过多的从库 (4)、网络延迟 (5)、表分区过多 (还有一些原因,欢迎补充) 4、MySQL常见存储引擎及各自特点。 (1)、InnoDB 支持事务、行级锁、支持外键约束,主要面向OLTP的应用

MySQL经典面试题

大兔子大兔子 提交于 2019-12-13 23:59:29
提到MySQL 相信很多人都不陌生,MySQL 作为目前最流行的关系型数据库管理系统,在很多的应聘中,都会频繁被面试官问及。于是就自己总结了一些在面试中,经常面试官被提及的一些问题,希望能带给更多人帮助。 接下来就跟着我的步伐来了解一下吧! 1、MySQL主从复制的原理。 (1)、主库必须开启二进制日志 (2)、当有增删改的语句时,会记录到主库的binlog中 (3)、主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)(这是msyql复制是异步复制的原因) (4)、从库的sql线程负责读取它的relay log里的信息并应用到数据库中 2、Seconds_Behind_Master的原理。 表示sql线程和io线程之间的时间差 具体的计算:从库服务器当前的时间戳与二进制日志中的事件的时间戳相对比得到的,所以只有在执行事件时才能报告延迟。 不足: 一些错误(例如主备的max_allowed_packet不匹配,或者网络不稳定)可能中断复制,由于主从复制是异步操作,Seconds_Behind_Master可能显示为0 3、主从延迟的主要原因有哪些? (1)、慢SQL语句过多 (2)、从库的硬件比主库差 (3)、同一个主库下有过多的从库 (4)、网络延迟 (5)、表分区过多 (还有一些原因,欢迎补充) 4、MySQL常见存储引擎及各自特点。 (1)

4-MySQL DBA笔记-开发进阶

末鹿安然 提交于 2019-12-13 18:10:31
第4章 开发进阶 本章将介绍一些重中之重的数据库开发知识。 在数据库表设计中,范式设计是非常重要的基础理论,因此本章把它放在最前面进行讲解,而这其中又会涉及另一个重要的概念——反范式设计。 接下来会讲述MySQL的权限机制及如何固化安全。 然后介绍慢查询日志及性能管理的部分理念,并讲述数据库的逻辑设计、物理设计、导入导出数据、事务、锁等知识。 最后会提及 MySQL的一些非核心特性,并对于这些特性的使用给出一些建议。 4.1 范式和反范式 4.1.1 范式 什么是范式? 范式是数据库规范化的一个手段,是数据库设计中的一系列原理和技术,用于减少数据库中的数据冗余,并增进数据的一致性。 数据规范化通常是将大表分成较小的表,并且定义它们之间的关系。这样做的目的是为了避免冗余存放数据,并确保数据的一致性。 添加、删除和修改数据等操作可能需要修改多个表,但只需要修改一个地方即可保证所有表中相关数据的一致性(由于数据没有冗余存放,修改某部分数据一般只需要修改一个表即可)。 由于数据分布在多个表之间,因此检索信息可能需要根据表之间的关系联合查询多个表。 数据规范化的实质是简单写、复杂读。 写入操作比较简单,对于不同的信息,分别修改不同的表即可;而读取数据则相对复杂,检索数据的时候,可能需要编写复杂的SQL来联合查询多个表。 常用的范式有第一、第二、第三范式,通常来说

MySQL面试题看这一篇就够了

有些话、适合烂在心里 提交于 2019-12-13 16:43:24
现在mysql相关的面试,面试官总会问一些相关的技术问题。在这里,因此就总结一些常见的mysql面试题,都是自己平时工作的总结以及经验。希望大家看完,能避开”面试坑”。 1、MySQL主从复制的原理。 (1)、主库必须开启二进制日志 (2)、当有增删改的语句时,会记录到主库的binlog中 (3)、主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)(这是msyql复制是异步复制的原因) (4)、从库的sql线程负责读取它的relay log里的信息并应用到数据库中 2、Seconds_Behind_Master的原理。 表示sql线程和io线程之间的时间差 具体的计算:从库服务器当前的时间戳与二进制日志中的事件的时间戳相对比得到的,所以只有在执行事件时才能报告延迟。 不足: 一些错误(例如主备的max_allowed_packet不匹配,或者网络不稳定)可能中断复制,由于主从复制是异步操作,Seconds_Behind_Master可能显示为0 3、主从延迟的主要原因有哪些? (1)、慢SQL语句过多 (2)、从库的硬件比主库差 (3)、同一个主库下有过多的从库 (4)、网络延迟 (5)、表分区过多 (还有一些原因,欢迎补充) 4、MySQL常见存储引擎及各自特点。 (1)、InnoDB 支持事务、行级锁、支持外键约束,主要面向OLTP的应用

MySQL经典面试题

霸气de小男生 提交于 2019-12-13 16:38:14
提到MySQL 相信很多人都不陌生,MySQL 作为目前最流行的关系型数据库管理系统,在很多的应聘中,都会频繁被面试官问及。于是就自己总结了一些在面试中,经常面试官被提及的一些问题,希望能带给更多人帮助。 接下来就跟着我的步伐来了解一下吧! 1、MySQL主从复制的原理。 (1)、主库必须开启二进制日志 (2)、当有增删改的语句时,会记录到主库的binlog中 (3)、主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)(这是msyql复制是异步复制的原因) (4)、从库的sql线程负责读取它的relay log里的信息并应用到数据库中 2、Seconds_Behind_Master的原理。 表示sql线程和io线程之间的时间差 具体的计算:从库服务器当前的时间戳与二进制日志中的事件的时间戳相对比得到的,所以只有在执行事件时才能报告延迟。 不足: 一些错误(例如主备的max_allowed_packet不匹配,或者网络不稳定)可能中断复制,由于主从复制是异步操作,Seconds_Behind_Master可能显示为0 3、主从延迟的主要原因有哪些? (1)、慢SQL语句过多 (2)、从库的硬件比主库差 (3)、同一个主库下有过多的从库 (4)、网络延迟 (5)、表分区过多 (还有一些原因,欢迎补充) 4、MySQL常见存储引擎及各自特点。 (1)