02-数据结构基础-树 树就是一种类似现实生活中的树的数据结构(倒置的树)。任何一颗非空树只有一个根节点。 一棵树具有以下特点: 一棵树中的任意两个结点有且仅有唯一的一条路径连通。 一棵树如果有 n 个结点,那么它一定恰好有 n-1 条边。 一棵树不包含回路。 下图就是一颗树,并且是一颗二叉树。 如上图所示,通过上面这张图说明一下树中的常用概念: 节点:树中的每个元素都可以统称为节点。 根节点:顶层节点或者说没有 2020-08-08 数据结构 #数据结构
02-数据结构基础-红黑树 红黑树介绍红黑树(Red Black Tree)是一种自平衡二叉查找树。它是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 由于其自平衡的特性,保证了最坏情形下在 O(logn) 时间复杂度内完成 2020-08-08 数据结构 #数据结构
02-查找-二分法 二分法查找二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好。缺点是要求待查表为有序表。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 二分查找的工作原理 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功。 否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查 2020-08-08 算法 #算法
03-排序 冒泡排序(Bubble Sort) 时间复杂度:最优时间复杂度:O(n),最坏时间复杂度:O(n²)。 优点:稳定,简单 缺点:效率不很高,运行时间较长 原理如下: 比较相邻的元素,如果第一个比第二个大,就交换他们两个; 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。做完以后,最后的元素会是最大的数,这里可以理解为走了一趟; 针对所有的元素重复以上的步骤,除了最后一个; 持续每次 2020-08-08 算法 #算法
03-排序 topk 一、TopK 问题定义topK问题比较经典,在面试算法题中考察也比较普遍,就是在一群无序的数中,找到最小的K个数和最大的K个数,或者第K个最大的数和第K个最小的数 本篇以寻找最小的K个数为例 二、解法1.快速排序面对topK问题,最能直接了当想到的做法便是排序,而后根据顺序用下标访问该元素即可。 平均时间复杂度:O(nlogn) 空间复杂度:O(1) 2.冒牌排序优化版既然只要前 K 的数 2020-08-08 算法 #算法
03-数据结构基础-堆 堆什么是堆堆是一种满足以下条件的树: 堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值。 大家可以把堆(最大堆)理解为一个公司,这个公司很公平,谁能力强谁就当老大,不存在弱的人当老大,老大手底下的人一定不会比他强。这样有助于理解后续堆的操作。 !!!特别提示: 很多博客说堆是完全二叉树,其实并非如此,堆不一定是完全二 2020-08-08 数据结构 #数据结构
04-数据结构基础-图 图是一种较为复杂的非线性结构。为啥说其较为复杂呢? 根据前面的内容,我们知道: 线性数据结构的元素满足唯一的线性关系,每个元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继。 树形数据结构的元素之间有着明显的层次关系。 但是,图形结构的元素之间的关系是任意的。 何为图呢? 简单来说,图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:**G(V,E)**,其中,G 表示一个 2020-08-08 数据结构 #数据结构
MySQL MVCC 1、简介MVCC(Multi-Version Concurrency Control,多版本并发控制),是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。用于支持 读已提交(RC) 和 可重复读(RR) 隔离级别的实现。 MVCC的实现依赖于六个概念:【隐式字段】【undo日志】【版本链】【快照读和当前读】【读视图】。 2、InnoDB 表的隐藏字段在 MySQL 中,Inno 2020-08-08 MySQL #MySQL
MySQL 主从同步三种模式:异步复制、半同步复制、全同步复制 异步复制 异步复制异步复制是 MySQL 默认的同步方式。 在 master 为 slave 开通账号密码、IP授权之后,slave 可以从 master 进行数据同步,主要依赖的是 master 的 binlog 日志。 slave 会启动两个线程,IO Thread 和 SQL Thread。IO Thread 负责从 master 拉取 binlog 日志,并写入 relay 中继日志。SQL Thr 2020-08-08 MySQL #MySQL
MySQL 主从复制 https://dev.mysql.com/doc/refman/8.0/en/replication.html 主从复制的原理和步骤简单的说: master 将数据库的改变写入二进制日志(binlog),slave 同步这些二进制日志并重新执行一遍,这样 slave 上的数据就和 master 上的数据相同了。 详细的说: master 启用二进制日志(binlog),记录任何修改数据 2020-08-08 MySQL #MySQL
MySQL 事务 官网保平安:https://www.mysql.com/MySQL 思维导图:https://www.processon.com/view/link/63bc2c8ea82ed9463ba99f38 MySQL 支持事务吗在缺省模式下,MySQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,MySQL 是不支持事务的。 如果你的 MySQL 表类型是 2020-08-08 MySQL #MySQL
MySQL 事务 和 锁、MVCC 的关系 官网保平安:https://www.mysql.com/MySQL 思维导图:https://www.processon.com/view/link/63bc2c8ea82ed9463ba99f38 事务共有四个级别 未提交读(Read Uncommitted, RU):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据 2020-08-08 MySQL #MySQL
MySQL 日志之 redo log 总结先来看一下 MySQL 事务更新数据执行流程。 当我们想要修改DB上某一行数据的时候,InnoDB 先判断数据页是否在内存中。 若为否,则从磁盘读取数据到内存中,返回数据行。 若是数据页在内存中,则直接返回数据行。 执行数据更新操作,然后把数据写入内存,同时把 redo log 写入到内存。 执行 commit 操作(此 commit 是 SQL 命令操作,而不是数据的 commit 状 2020-08-08 MySQL #MySQL
MySQL 索引 备注:我们往 MySQL 插入的数据最终都是存在页中的。在 InnoDB 的设计中,页与页之间是通过一个双向链表连接起来。 1、为什么需要索引一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到 索引 了。 如果没有索引,我们在查 2020-08-08 MySQL #MySQL
MySQL 索引下推 索引下推索引下推(Index Condition Pushdown,简称 ICP) 是 MySQL 5.6 提供的一项索引优化功能,它允许存储引擎在索引遍历过程中,执行部分 WHERE 字句的判断条件,直接过滤掉不满足条件的记录,从而减少需要从存储引擎中检索的数据行数,提高查询效率。 下面以 Innodb 数据库为例:假设我们有一个名为 user 的表,其中包含 id, username, zip 2020-08-08 MySQL #MySQL
MySQL 索引为什么使用B+Tree 0、先验知识二分查找法二分查找法也叫作折半查找法,它是在有序数组中查找指定数据的搜索算法。它的优点是等值查询、范围查询性能优秀,缺点是更新数据、新增数据、删除数据维护成本高。 首先定位left和right两个指针。 计算(left+right)/2。 判断除2后索引位置值与目标值的大小比对。 索引位置值大于目标值就-1,right移动;如果小于目标值就+1,left移动。 1、背景My 2020-08-08 MySQL #MySQL
MySQL 锁 官网保平安:https://www.mysql.com/MySQL 思维导图:https://www.processon.com/view/link/63bc2c8ea82ed9463ba99f38 MySQL 中锁的种类 ★★★按锁粒度从大到小分类:表锁、页锁和行锁 以及特殊场景下使用的 全局锁 表锁:表级别的锁定是 MySQL 各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现 2020-08-08 MySQL #MySQL
MySQL 隐式转换 背景平时在使用 MySQL 的时候发现即使字段类型是 int,但是拿字符串去查询也能查到。那这是为什么呢?背后自然是 MySQL 帮我们自动转换了。 WHERE 条件语句里,字段属性和赋给的条件,当数据类型不一样,这时候是没法直接比较的,需要进行一致转换。 隐式转换规则官方文档中关于隐式转化的规则是如下描述的: 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 < 2020-08-08 MySQL #MySQL
MySQL 页 页是什么首先,我们需要知道,页(Pages)是 InnoDB 中管理数据的最小单元。 Buffer Pool 中存的就是一页一页的数据。再比如,当我们要查询的数据不在 Buffer Pool 中时,InnoDB 会将记录所在的页整个加载到 Buffer Pool 中去;同样的,将 Buffer Pool 中的脏页刷入磁盘时,也是按照页为单位刷入磁盘的。 页的概览我们往 MySQL 插入的数据最终都 2020-08-08 MySQL #MySQL
MySQL 预编译 1、什么是MySQL的预编译?我们发送一条 SQL 语句给 MySQL 服务器时,MySQL 服务器每次都会对这条 SQL 语句进行校验、解析等操作。 有很多情况,一条 SQL 语句可能需要反复的执行,而 SQL 语句也只可能传递的参数不一样,这样的 SQL 语句如果每次都进行校验、解析等操作,有些太过于浪费性能了,因此提出了 SQL 语句的预编译。 所谓预编译就是将一些灵活的参数值以占位符 ? 2020-08-08 MySQL #MySQL