InnoDB

mysql执行过程以及顺序

你说的曾经没有我的故事 提交于 2020-10-05 17:53:57
前言:mysql在我们的开发中基本每天都要面对的,作为开发中的数据的来源,mysql承担者存储数据和读写数据的职责。因为学习和了解mysql是至关重要的,那么当我们在客户端发起一个sql到出现详细的查询数据,这其中究竟经历了什么样的过程?mysql服务端是如何处理请求的,又是如何执行sql语句的?本篇博客将来探讨这个问题: 本篇博客的目录 一:mysql执行过程 二:mysql执行过程中的状态 三:mysql执行的顺序 四:总结 一:mysql执行过程 mysql整体的执行过程如下图所示: 1.1:连接器 连接器的主要职责就是: ①负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行,其中mysql在与客户端连接TCP/IP的 ②验证请求用户的账户和密码是否正确,如果账户和密码错误,会报错:Access denied for user 'root'@'localhost' (using password: YES) ③如果用户的账户和密码验证通过,会在mysql自带的权限表中查询当前用户的权限: mysql中存在4个控制权限的表, 分别为 user表,db表,tables_priv表,columns_priv表 , mysql权限表的验证过程为: 1: User表 : 存放用户账户信息以及全局级别(所有数据库

MySQL读取数据时发生了什么?数据读取过程分析[图]

依然范特西╮ 提交于 2020-10-05 06:32:11
上一篇我们说到B+树拼接一己之力杀出重围,最后成为了InnoDB和MyISAM这两种存储引擎的索引实现。我们都知道索引心里是有B+树的,他知道自己不可能全部存储在内存中,他一般是以「索引文件的形式存储的磁盘上」。那么MySQL读取数据时都发生了什么呢?这得从内存开始说起。 IRAM与ROM ROM,Read-OnlyMemory:只读储存器,可以理解为电脑的硬盘上存放操作系统的软件,手机的内置储存上存放操作系统的软件,单片机的Flash上存放操作系统的软件。总之就是用来存储操作系统的软件。 RAM,Random-AccessMemory:随机储存器,可以理解为电脑的内存条。用于存放动态数据,也叫运行内存。系统运行的时候,需要把操作系统从ROM中读取出来,放在RAM中运行。 CPU要运行程序需要从ROM调取,但ROM又有距离,所以需要用RAM来做一个连接。 I主存存储原理 RAM主要的作用就是存储代码和数据供CPU在需要的时候调用,但是这些数据并不是像用碗盛饭那么简单,我们是需要知道数据的特定位置信息。他更像是图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来,虽然都是书但是每本书是不同的。对于RAM等存储器来说也是一样的,虽然存储的都是代表0和1的代码,但是不同的组合就是不同的数据。 抽象地看,主存是一系列的存储单元组成的矩阵

The complete list of new features in MySQL 8.0

故事扮演 提交于 2020-10-04 06:05:13
截止目前最完整的MySQL 8.0新特性列表。 原文出处:https://mysqlserverteam.com/the-complete-list-of-new-features-in-mysql-8-0/ There are over 300 new features in MySQL 8.0. The MySQL Manual is very good, but verbose. This is a list of new features in short bullet form. We have tried very hard to make sure each feature is only mentioned once. Note the similar list for MySQL 5.7. Please download MySQL 8.0 from dev.mysql.com or from the MySQL Yum, APT, or SUSE repositories. SQL DML Non-recursive CTEs [1] Recursive CTEs [1] Window functions [1] ORDER BY and DISTINCT with ROLLUP [1] LATERAL derived tables [1] Outer

一文带你搞懂 MySQL 中的分区!

不问归期 提交于 2020-10-03 15:44:02
阅读本文大概需要 6 分钟。 作者 | GrimMjx 来源 | https://www.cnblogs.com/GrimMjx/p/10526821.html 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。 段 段就是上图的segment区域,常见的段有数据段、索引段、回滚段等,在InnoDB存储引擎中,对段的管理都是由引擎自身所完成的。 区 区就是上图的extent区域,区是由连续的页组成的空间,无论页的大小怎么变,区的大小默认总是为1MB。 为了保证区中的页的连续性,InnoDB存储引擎一次从磁盘申请4-5个区,InnoDB页的大小默认为16kb,即一个区一共有64(1MB/16kb=16)个连续的页。 每个段开始,先用32页(page)大小的碎片页来存放数据,在使用完这些页之后才是64个连续页的申请。这样做的目的是,对于一些小表或者是undo类的段,可以开始申请较小的空间,节约磁盘开销。 页 页就是上图的page区域,也可以叫块。页是InnoDB磁盘管理的最小单位。默认大小为16KB,可以通过参数innodb_page_size来设置。 常见的页类型有:数据页,undo页,系统页,事务数据页,插入缓冲位图页,插入缓冲空闲列表页,未压缩的二进制大对象页,压缩的二进制大对象页等。

让你薪资翻倍的mysql优化面试回答,面试官都惊呆了。。

你。 提交于 2020-10-03 06:31:00
当面试官问你mysql优化 首先要知道 mysql 分为两个层次。你要逐一从各个层次讲解mysql优化,让面试官知道,哇,原来你对mysql这么了解。 面试官:你知道哪些mysql优化? 我: …巴拉巴拉巴拉。 mysql结构层次 首先,mysql分为server层和引擎层。 server层有 连接器 。对于连接器可以通过建立连接池来进行优化。连接器进行连接的时候会消耗资源,还会进行权限验证等操作,为了避免频繁创建连接,所以使用连接池。 server层还有 缓存模块 ,只不过 缓存模块 在新版本,也就是mysql8中被去掉了。 server层还有 分析器 ,进行语法分析之类的,这里没啥可优化的。 server层还有 优化器 ,优化器会对sql语句进行优化,以及选择索引等操作。针对这里的优化就是写出更好的sql语句,尽量减少优化器的工作,用对索引,创建更好的索引等。具体的后面在详细说明。 server层还有 执行器 ,负责执行优化器输出的执行计划,执行计划可以通过 explain 语句来查看,通过执行计划可以看到执行扫描的行数,是否使用索引,在连表时候使用的算法,是否用到了排序等等信息。 除了server层就是引擎层的优化。引擎层的优化主要是通过优化sql语句和创建索引来完成。重点也就是sql语句和索引部分。 sql语句的优化 select * 还是字段问题 很多人都会说要使用

阿里P7大佬手把手叫我如何判断一个数据库是不是出问题了,受教了!

旧街凉风 提交于 2020-10-03 04:03:23
欢迎关注专栏: Java架构技术进阶 。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。 最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请移步 GitHub 在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。 主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切换,往往是因为主库出问题了,由 HA 系统发起的。 这也就引出了我们今天要讨论的问题:怎么判断一个主库出问题了? 你一定会说,这很简单啊,连上 MySQL,执行个 select 1 就好了。但是 select 1 成功返回了,就表示主库没问题吗? select 1判断 实际上,select 1 成功返回,只能说明这个库的进程还在,并不能说明主库没问题。现在,我们来看一下这个场景。 set global innodb_thread_concurrency = 3 ; CREATE TABLE `t` ( `id` int ( 11 ) NOT NULL , `c` int ( 11 ) DEFAULT NULL , PRIMARY KEY ( `id` ) ) ENGINE = InnoDB ; insert into t values ( 1 , 1 ) 图 1

mysql

主宰稳场 提交于 2020-10-03 02:58:58
今天测试同事在导入mysql脚本时遇到错误: Specified key was too long; max key length is 767 bytes 经过百度,错误原因为: 数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引,而mysql默认情况下单个列的索引不能超过767位,于是utf8字符编码下,255*3 byte 超过限制(测试5.7以上版本是没问题的,5.6及以下不行) 进一步百度,确认如下解决方案: 1 、使用innodb引擎; 2 、启用innodb_large_prefix选项,将约束项扩展至3072bytes 3、设置 innodb_file_format为 Barracuda (5.6版本默认为 Antelope,相关介绍,请参阅: https://www.cnblogs.com/wilburxu/p/9435818.html https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format ) 来源: oschina 链接: https://my.oschina.net/u/4469818/blog/4279771

01MySQL内核分析-The Skeleton of the Server Code

徘徊边缘 提交于 2020-10-02 23:56:45
摘要 这个官方文档一段对MySQL内核分析的一个向导。是对MySQL一条insert语句写入到MySQL数据库的分析。 但是,对于MySQL 5.7版本来说,基本上都是写入到innodb引擎。但也还是有借鉴意义,大的框架没有太大变化。 后面的文档,会通过mysqld --debug 和 gdb 等工具,通过分析mysqld.trace来分析insert语句在MySQL 5.7中怎么写入数据库。 官方文档给出的一段结构,如下: /sql/mysqld.cc /sql/sql_parse.cc /sql/sql_prepare.cc /sql/sql_insert.cc /sql/ha_myisam.cc /myisam/mi_write.c 上述梳理一个过程,是说从客户段执行一条简单的insert语句,然后到达MySQL服务器端,并通过MyISAM存储层。写入到MyISAM文件的过程。 由于,我们现在的主流都是InnoDB存储引擎,所以我们分析的写入到存储层应该是InnoDB的源代码。但是上述的一个框架也有借鉴意义。虽然,走的是InnoDB存储引擎插入数据,但是也还是需要通过SQL层的ha_*这样的接口进行接入。 正题开始!!!!!!!!!!!!!!!!!!!!!!! 第一步,进入MySQL大门的地方。梦开始的地方。众所周知,C语言都是需要main方法作为主入口

数据库怎么选择?| 文末送书

不问归期 提交于 2020-10-02 22:15:44
武培轩 推荐搜索 MySQLRedisElasticsearchJavaSpring Boot数据结构 所有数据库管理系统的主要工作都是「可靠地存储数据」并使其对用户可用。我们使用数据库作为数据的主要来源,帮助我们在应用程序的不同部分之间共享数据。我们使用数据库,而不是在每次创建新应用程序时寻找存储和检索信息的方法,也不是每次都去发明一种组织数据的新方法。这样一来,我们就可以专注于应用程序逻辑而不是基础设施。 数据库是模块化的系统,由多个部分组成:接受请求的传输层、决定以最高效方式运行查询的查询处理器、执行操作的执行引擎以及存储引擎。 存储引擎(或数据库引擎)是数据库的一个软件组件,它负责在内存和磁盘上存储、检索和管理数据,而设计它的目的是长久保存每个节点的数据[REED78]。数据库可以响应复杂的查询,存储引擎则会更细粒度地看待数据并提供一组简单的数据操作API,允许用户创建、更新、删除和检索数据记录。从某个角度来看,数据库是构建在存储引擎之上的应用程序,它提供了表结构(schema)、查询语言、索引、事务和许多其他有用的特性。 为了获得灵活性,键和值都可以是没有预设格式的任意字节序列。它们的排序和表示语义是在更高级别的子系统中定义的。例如,你可以在一个表中使用int32(32位整数)作为键,而在另一个表中使用ascii(ASCII字符串);从存储引擎的角度来看

技术分享 | MySQL 子查询优化

老子叫甜甜 提交于 2020-10-02 17:42:49
作者:胡呈清 爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客: https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 有这么一个 SQL,外查询 where 子句的 bizCustomerIncoming_id 字段,和子查询 where 字句的 cid 字段都有高效索引,为什么这个 SQL 执行的非常慢,需要全表扫描? delete FROM biz_customer_incoming_path WHERE bizCustomerIncoming_id IN \ (SELECT id FROM biz_customer_incoming WHERE cid='315upfdv34umngfrxxxxxx'); 我们从这么一个问题来引入接下来的内容,如果你知道答案就不用继续看下去了。 子查询优化策略 对于不同类型的子查询,优化器会选择不同的策略。 对于 IN、=ANY 子查询,优化器有如下策略选择: semijoin Materialization exists 对于 NOT IN、<>ALL 子查询,优化器有如下策略选择: Materialization exists 对于 derived 派生表,优化器有如下策略选择: