
mysql
文章平均质量分 66
小志的博客
随笔笔记,仅供参考
展开
-
VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)
VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)原创 2023-11-21 23:09:36 · 2224 阅读 · 0 评论 -
VMware——WindowServer2012R2环境安装mysql5.7.14解压版_主从复制(图解版)
VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)原创 2023-11-19 23:42:29 · 1785 阅读 · 0 评论 -
Navicat导出SQL语句并在Power Designer中生成物理模型
Navicat导出SQL语句并在Power Designer中生成物理模型原创 2023-04-25 21:15:00 · 1303 阅读 · 0 评论 -
MySQL——MySQL InnoDB的MVCC实现机制
MySQL——MySQL InnoDB的MVCC实现机制转载 2023-01-10 22:00:00 · 255 阅读 · 0 评论 -
Mysql——LRU链表
目录一、LRU链表的概述二、LRU链表的处理逻辑三、LRU链表的优缺点四、预读的概述五、预读的分类(根据触发方式分类)六、造成Buffer Pool命中率低的原因七、Buffer Pool命中率低的解决方式八、对于简单LRU链表的缺点优化一、LRU链表的概述LRU = Least Recently Used(最近最少使用);由于缓冲区空间有限,如果满了,则需要把旧的移除掉,新的加进来;把使用频繁的数据保留在缓存中,把使用频率低的数据移除;用来记录缓冲页的被使用热度;Buffer Pool的缓冲原创 2021-11-02 22:00:43 · 2137 阅读 · 0 评论 -
Mysql——BufferPool的理解
目录一、BufferPool的概述二、什么是BufferPool三、如何判断一个页是否在Buffer Pool中被缓存一、BufferPool的概述无论是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的。所谓表空间,只不过是InnoDB对一个或几个实际文件的抽象。也就是说,我们的数据说到底还是存储在磁盘上的。但是磁盘读取速度很慢,所以如果需要访问某个页的数据时,InnoDB会把完整的页中的数据全部加载到内存中。即使只需要访问一个页里面的一条记录,也需要先把整个页的数据加载到原创 2021-11-02 22:20:10 · 360 阅读 · 0 评论 -
MySQL——页的理解
目录一、MySQL中页的概述二、InnoDB存储引擎中数据页的结构示意图三、记录在数据页中的存储方式1、行格式或者记录格式的理解2、记录在页中的存储示意图3、记录在页中的存储整个流程四、记录头信息的理解1、COMPACT行格式示意图2、记录头信息的说明一、MySQL中页的概述为了避免一条一条读取磁盘数据,InnoDB采取页的方式,作为磁盘和内存之间交互的基本单位。一个页的大小一般是16KB。InnoDB为了不同的目的而设计了多种不同类型的页。比如:存放表空间头部信息的页、存放undo日志信息的页等原创 2021-10-29 23:14:44 · 3824 阅读 · 0 评论 -
Mysql——页的目录项的理解
一、Mysql中使用页的目录项的前提条件记录在页中是按照主键值从小到大的顺序串联成为一个单向链表。那么如果我们要查询id=4的数据,我们用笨方法就是从记录的链表头开始,一直往下查找。但是,如果数据量很大,那么性能就无法保证了。针对这个问题,InnoDB采取了图书目录的解决方案,即:Page Directory。二、图书目录(即Page Directory)的生成步骤1、 首先,将非删除的数据(包含Infimum记录和Supremum记录)划分几个组。(1)、分组规则如下:对于Infimum记原创 2021-10-29 23:43:31 · 2964 阅读 · 3 评论 -
Mysql——多实例BufferPool
一、多实例BufferPool的概述在Buffer Pool特别大并且多线程并发访问量特别高的情况下,单一的Buffer Pool可能会影响请求的处理速度。所以,在Buffer Pool特别大时,可以把它们拆分成若干个小的Buffer Pool,每个Buffer Pool都称为一个实例。它们都是独立的(即独立地申请内存空间,独立地管理各种链表)。可以通过设置innodb_buffer_pool_instances的值来修改Buffer Pool实例的个数。每个Buffer Pool实例实际占原创 2021-11-03 14:01:35 · 569 阅读 · 1 评论 -
Mysql——BufferPool中chunk的理解
一、BufferPool中chunk的概述由于每次调整Buffer Pool的大小时,都需要重新向操作系统申请一块连续的内存空间,然后将旧的Buffer Pool中的内容复制到这一块新空间,但是这种操作是极其耗时的。所以,InnoDB不再一次性为某个Buffer Pool实例向操作系统申请一大片连续的内存空间,而是以一个chunk为单位向操作系统申请空间。也就是说,一个Buffer Pool实例其实是由若干个chunk组成的。一个chunk就代表一片连续的内存空间,里面包含了若干缓冲页与其对应的控制块原创 2021-11-03 20:30:00 · 1370 阅读 · 1 评论 -
Mysql——free链表
一、free链表的概述当MySQL启动的时候,需要向操作系统申请Buffer Pool的内存空间,但是,当从磁盘上读取一个页然后存储到Buffer Pool的时候,该存放到Buffer Pool的哪个位置呢?而Buffer Pool中是存在有数据的空间和无数据的空间,那么问题又来了,怎么去区分哪些缓冲页是空闲的呢?针对这个问题,free链表就可以满足上述需求了。Buffer Pool的初始化过程中,是先向操作系统申请连续的内存空间,然后把它划分成若干个【控制块&缓冲页】对。当插入数原创 2021-11-03 21:45:00 · 1645 阅读 · 0 评论 -
Mysql——flush链表
一、flush链表概述如果我们修改了Buffer Pool中某个缓冲页的数据,那么它就与磁盘上的页不一致了,这样的缓冲页也被称之为脏页(dirty page)。为了性能问题,我们每次修改缓冲页后,并不着急立刻把修改刷新到磁盘上,而是在未来的某个时间点进行刷新操作。如果有了修复发生,不是立刻刷新,那之后再刷新的时,我们怎么知道Buffer Pool中哪些页是脏页,哪些页从来没有被修改过呢?创建一个存储脏页的链表,凡是被修改过的缓冲页对应的控制块都会作为节点加入到这个链表中。该链表也被称为原创 2021-11-03 22:00:00 · 1143 阅读 · 0 评论 -
MySQL——索引
目录一、mysql中如果没有索引如何查找数据1、方式一:在一个页中查找2、方式二:在多个页中查找二、mysql中索引的概念1、前提条件2、目录项记录3、如何区分普通用户记录和目录项记录4、普通用户记录和目录项的区别有哪些?三、mysql中B+树1、如何快速定位目录项2、上图中B+树的解释一、mysql中如果没有索引如何查找数据1、方式一:在一个页中查找比如数据较少,都存储在一个页中。在查找记录时,是要根据搜索条件的不同分为两种情况的。第一种情况:以主键列作为搜索条件(1)、在页目录(Page原创 2021-11-04 20:45:00 · 1543 阅读 · 0 评论 -
MySQL——有哪些索引
一、聚簇索引在InnoDB存储引擎中,聚簇索引就是数据的存储方式,也就是所谓的“索引即数据,数据即索引”。聚簇索引只能在搜索条件是主键值时才能发挥作用,原因是B+树中的数据都是按照主键进行排序的。二、聚簇索引特点1、记录&页都是按照主键值的大小进行排序的记录:按照主键的大小顺序排成一个单向链表;页内的记录被划分成若干个组,每个组中主键值最大的记录在页内的偏移量会被当作槽依次存放在页目录中。页:按照主键的大小顺序排成一个双向链表;存放目录项记录的也分为不同的层级,同层页中的目录项记录原创 2021-11-05 21:00:00 · 577 阅读 · 0 评论 -
MySQL——redo日志类型中的物理日志
一、物理日志的概述在对页面的修改是极其简单的情况下,redo日志中只需要记录一下在某个页面的某个偏移量处修改了几个字节的值、具体修改后的内容是啥就好了。二、物理日志的示例说明如果某张表没有主键,并且没有定义不允许存储NULL值的UNIQUE键,那么InnoDB会自动为表添加一个名为row_id的隐藏列作为主键。为这个row_id隐藏列进行赋值的方式如下:(1)内存中维护一个全局变量,当向某个包含row_id隐藏列的表中插入一条记录时,就会把这个全局变量的值当做新记录的row_id的值,并且把原创 2021-11-07 21:58:23 · 836 阅读 · 0 评论 -
MySQL——redo日志
一、问题描述1、存在的问题如果我们只在内存的Buffer Pool中修改了页面,假设在事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交的事务在数据库中所做的更改也就丢失了。针对这种问题,怎么处理呢?2、解决方案一1、方案一在事务提交时,把该事务修改的所有页面都刷新到磁盘。2、方案一的缺点刷新一个完整的数据页浪费内存。虽然我们只修改了一条记录,但是会将这条记录所在的页(16KB)都刷新到磁盘上,会造成大量磁盘I/O的浪费。随机I/O刷新起来比较慢。一个事务可能原创 2021-11-07 21:40:33 · 485 阅读 · 0 评论 -
MySQL——redo日志类型中的复杂日志
目录一、复杂日志类型概述二、解决方案三、redo复杂日志类型四、日志类型的解释一、复杂日志类型概述1、INSERT语句所涉及到的数据变动当我们执行一条INSERT语句涉及的更新内容的时候,其实并不是只是对用户数据进行了插入操作,底层其实涉及了很多,比如页数据的更新,分裂,数据迁移,甚至是,如果采用默认row_id来维护记录的唯一标识的话,还会涉及到MAX_ROW_ID的变动。INSERT语句所涉及到的数据变动。所下图所示表示:注:用户数据指的就是聚簇索引和二级索引对应的B+树。2、INSER原创 2021-11-07 22:18:29 · 225 阅读 · 0 评论 -
Mysql——undo日志、事务id
一、什么是undo日志1、事务的原子性事务是需要保证原子性的,也就是说,事务中的操作要么全部完成,要么什么也不做。2、造成事务执行不完的情况情况一:事务执行过程中可能遇到各种错误,比如:代码bug出现异常。情况二:事务执行过程中手动输入rollback语句结束当前事务的执行。3、回滚(rollback)遇到上面的2种情况,为了保证事务的原子性,我们需要把数据还原回原来的样子,这个过程就叫做回滚(rollback)。有时候仅需要对部分语句进行回滚,有时间需要对整个事务进行回滚。4、原创 2021-11-09 21:00:00 · 1892 阅读 · 0 评论 -
Mysql——INSERT操作对应的undo日志
目录一、undo日志概述二、INSERT操作对应的undo日志一、undo日志概述一般来说,每对一条记录进行一次改动,就对应着1条undo日志(某些情况下,也可能会对应着2条undo日志)。在一个事务中,这些undo日志会从0开始编号,每生成一条undo日志,那么该条日志的undo no就加1。即:第0号undo日志、第1号undo日志等等。这个编号也称为undo no。这些undo日志被记录到类型为FIL_PAGE_UNDO_LOG的页面中。对于表中数据进行不同操作都会产生什么样原创 2021-11-09 21:30:00 · 1734 阅读 · 0 评论 -
Mysql——DELETE操作对应的undo日志
目录一、正常记录链表二、垃圾链表三、PAGE_FREE的作用四、删除一条记录的步骤五、关于垃圾链的重用空间的知识点了解1、PAGE_GARBAGE是做什么的2、如何重用垃圾链表的存储空间3、如果新插入的那条记录记录小于重用的记录空间,那么会有一部分空间用不到,怎么处理?是否可以直接浪费掉?4、什么TRX_UNDO_DEL_MARK_REC类型的undo日志保存旧记录的trx_id值和roll_pointer值六、删除操作生成undo日志的示例一、正常记录链表记录的头信息中的next_record属性组原创 2021-11-13 21:17:11 · 3339 阅读 · 1 评论 -
Mysql——UPDATE操作对应的undo日志
目录1、 UPDATE操作对应的undo日志2、不更新主键的情况3、更新主键的情况1、 UPDATE操作对应的undo日志在执行update语句时,InnoDB对更新主键和不更新主键这两种情况有截然不同的处理方式。2、不更新主键的情况(1)、就地更新在更新记录时,对于被更新的每个列来说,如果更新后的列与更新前的列占用的存储空间一样大,那么可以进行就地更新,也就是直接在原记录的基础上修改对应列的值。(2)、先删除旧记录,再插入新记录如果有任何一个被更新的列在更新前后占用的存储空间大小原创 2021-11-13 21:43:55 · 2506 阅读 · 1 评论 -
MySQL——锁
目录一、解决并发事务带来的问题1.1、【写-写】的情况1.2、 【读-写】或【写-读】的情况1.3、一致性读1.4、锁定读1.5、写操作二、多粒度锁一、解决并发事务带来的问题1.1、【写-写】的情况由于任何一种隔离级别都不允许脏写(写-写)的现象发生,所以,当多个未提交事务相继对一条记录进行改动的时候,就需要让它们排队执行。这个排队的过程其实是通过为该记录加锁来实现的。这个锁本质上是一个内存中的结构。【写-写】的具体操作流程如下:【上图解释如下:】(1)、一开始是没有锁结构与原创 2021-12-26 15:59:44 · 1646 阅读 · 7 评论 -
MySQL——B+ Tree 原理
MySQL——B+ Tree 原理原创 2023-01-10 21:00:00 · 1112 阅读 · 0 评论 -
window环境安装mysql8.0.12版本的安装、配置(详细步骤图解)
window环境安装mysql8.0.12版本的安装、配置(详细步骤图解)原创 2023-01-03 23:02:15 · 2895 阅读 · 0 评论 -
MySQL5.7创建唯一索引时报错提示Duplicate entry * for key *
一、报错原因因表中创建唯一索引的列有重复数据,导致创建唯一索引时报错提示Duplicate entry * for key *二、报错演示例如lz用户表中用户名、邮箱和创建时间三列属性中存在相同的数据,如下图:再创建用户名、邮箱和创建时间三列作为唯一索引时,提示Duplicate entry xxx for key xxx错误,如下图:三、解决方式先去掉重复数据,在创建用户名、邮箱和创建时间三列作为唯一索引,报错消失,如下图:...原创 2021-07-10 17:00:34 · 4148 阅读 · 1 评论 -
MySQL5.7新增数据避免重复记录
目录一、MySQL5.7新增数据避免数据重复的语法二、MySQL5.7新增数据避免数据重复的演示示例1、建表并初始化假数据2、创建唯一索引3、插入用户名、邮箱和创建时间三个属性值的数据已经存在用户表中的数据,会提示警告,并不会插入数据成功4、插入用户名、邮箱和创建时间三个属性值的数据其中只要有一个值与用户表中的用户名、邮箱和创建时间的数据不同,都会插入数据成功。一、MySQL5.7新增数据避免数据重复的语法语法数据已存在数据不存在insert ignore忽略插入二、My原创 2021-07-10 16:50:02 · 353 阅读 · 1 评论 -
mysql清空表数据后,id重新从1开始自增
目录一、建表语句二、清空用户表数据后,id重新从1开始自增一、建表语句1、创建用户表语句CREATE TABLE `sys_user` ( `id` int(8) NOT NULL AUTO_INCREMENT, `user_name` varchar(50) DEFAULT NULL, `user_age` int(2) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=原创 2021-07-06 22:53:03 · 10497 阅读 · 3 评论 -
MySQL高级——Mysql行锁总结、分析与优化建议
一、Mysql行锁总结Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定的。当系统并发量较高的时候,Innodb的整体性能和MyISAM相比就会有比较明显的优势了。但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MyISAM高,甚至可能会更差。二、Mysql行锁分析1、如何分析Mysql行锁定#分析行锁定的sql原创 2021-03-31 23:10:38 · 524 阅读 · 0 评论 -
MySQL高级——Mysql如何锁定一行数据
目录一、建表SQL二、Mysql锁定一行数据语法三、Mysql锁定一行数据的基本演示一、建表SQL1、创建test_innodb_lock表的SQLCREATE TABLE test_innodb_lock (a INT(11),b VARCHAR(16))ENGINE=INNODB;INSERT INTO test_innodb_lock VALUES(1,'b2');INSERT INTO test_innodb_lock VALUES(3,'3');INSERT INTO test原创 2021-03-30 23:08:05 · 4484 阅读 · 1 评论 -
MySQL高级——MySql间隙锁的案例
目录一、建表SQL二、MySql间隙锁的基本演示三、什么是间隙锁四、间隙锁危害一、建表SQL1、创建test_innodb_lock表的SQLCREATE TABLE test_innodb_lock (a INT(11),b VARCHAR(16))ENGINE=INNODB;INSERT INTO test_innodb_lock VALUES(1,'b2');INSERT INTO test_innodb_lock VALUES(3,'3');INSERT INTO test_in原创 2021-03-30 22:49:30 · 452 阅读 · 0 评论 -
MySQL高级——MySql行锁升级为表锁案例
目录一、建表SQL二、MySql无索引行锁升级为表锁基本演示一、建表SQL1、创建test_innodb_lock表的SQLCREATE TABLE test_innodb_lock (a INT(11),b VARCHAR(16))ENGINE=INNODB;INSERT INTO test_innodb_lock VALUES(1,'b2');INSERT INTO test_innodb_lock VALUES(3,'3');INSERT INTO test_innodb_lock原创 2021-03-29 22:48:32 · 1333 阅读 · 3 评论 -
MySQL高级——MySql行锁案例
一、建表SQL1、创建mylock表的SQL原创 2021-03-28 23:10:26 · 442 阅读 · 1 评论 -
MySQL高级——MySql行锁介绍
目录一、MySql锁机制(行锁)的特点二、InnoDB引擎与MyISAM引擎最大不同点三、事务(Transaction)及其ACID属性介绍四、MySql并发事务处理带来的问题五、事务隔离级别介绍一、MySql锁机制(行锁)的特点偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。二、InnoDB引擎与MyISAM引擎最大不同点InnoDB引擎支持事务(TRANSACTION),MyISAM引擎不支持InnoDB引擎采用了行级锁,MyI原创 2021-03-27 21:56:48 · 315 阅读 · 0 评论 -
MySQL高级——MySql锁机制(表锁)
目录一、MySql表锁(偏读)特点二、建表SQL三、MySql手动增加表锁的案例分析四、MySql手动释放表锁的案例分析五、MySql手动增加表的读锁案例分析一、MySql表锁(偏读)特点偏向MyISAM存储引擎;开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。二、建表SQL创建mylock表的SQLCREATE TABLE mylock ( id INT(11) NOT NULL AUTO_INCREMENT, username VARCHAR(20)原创 2021-03-25 23:16:58 · 1876 阅读 · 0 评论 -
MySQL高级——MySql锁机制概述
一、MySql锁的定义锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。二、生活购物中用到的数据库锁的案例例如:我们到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买,那么如何解决是你买到还是另一个人买到的原创 2021-03-23 23:17:25 · 209 阅读 · 0 评论 -
MySQL高级——全局查询日志
目录一、编码方式启用全局查询日志二、配置方式启用全局查询日志三、开启全局查询日志注意事项一、编码方式启用全局查询日志1、查看是否启用全局查询日志SHOW VARIABLES LIKE 'general_log';2、启用全局查询日志#启用全局查询日志set global general_log=1;3、设置全局日志存放位置可以存放到日志文件中,也可以存放到Mysql系统表中。存放到日志中性能更好一些。#存储到Mysql系统表中,set global log_output='T原创 2021-03-23 23:00:34 · 423 阅读 · 0 评论 -
MySQL高级——Show Profile调优测量SQL
一、Show Profile是什么Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量。官网:http://dev.mysql.com/doc/refman/5.5/en/show-profile.html默认情况下,参数处于关闭状态,并保存最近15次的运行结果。二、Show Profile分析步骤1、是否支持,看看当前的mysql版本是否支持SHOW VARIABLES LIKE 'profiling';2、开启功能,默认是原创 2021-03-23 22:33:55 · 307 阅读 · 0 评论 -
MySQL高级——批量插入数据脚本
目录一、建表语句二、设置开启创建函数功能的log_bin_trust_function_creators参数三、往表里插入1W条数据进行示例演示3.1、创建往表里插入的每条数据都不同的函数3.2、创建往表里插入数据的存储过程3.3、调用存储过程一、建表语句CREATE TABLE `dept` ( `id` INT(8) NOT NULL AUTO_INCREMENT, `deptno` INT(11) DEFAULT '0' COMMENT '部门编号', `dname` VARCHAR(原创 2021-03-22 23:18:55 · 1053 阅读 · 0 评论 -
MySQL高级——慢查询日志
一、慢查询日志是什么Mysql的慢查询日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条SQL执行超过5秒钟,我们就算慢SQL,希望能手机超过5秒的sql,结合之前explain进行全面分析。二、慢查询日志的说明默认情况下,Mysql数据库没有开原创 2021-03-22 21:24:09 · 617 阅读 · 0 评论 -
MySQL高级——查询优化3(Group By关键字优化)
一、Group By关键字优化Group By关键字优化与Order by关键字优化同理,可参考lz的Order by关键字优化文博链接一、Group By关键字优化与Order by关键字优化的区别Goup by 实质是先排序后进行分组,遵照索引建的最佳左前缀原则;当无法使用索引列时:(1)、增大max_length_for_sort_data参数的设置;(2)、增大sort_buffer_size参数的设置;where高于having,能写在where限定的条件就不要去having限原创 2021-03-17 22:44:32 · 401 阅读 · 0 评论