现在项目遇到个问题,我相册图片里面有很多分类,我想取出每个分类下面的前三条数据,应该怎么做呢?
二叉搜索树:当要保存的元素多时,就会使整个树的高度变高,这样比较的次数就会越来越多,但由于是在硬盘上,所以不太合适。...B+树的优势: N叉搜索树,高度比较低, 此时硬盘IO次数就比较少...."还原操作",相当于将前面的SQL进行了"撤销操作",最终像是没执行一样,这样的机制称为"回滚",同时把事务支持的上述特性称为原子性 数据库是如何知道具体是怎样回滚的,如何知道前面的sql做出了什么修改...MySQL是一个"客户端-服务器"结构的程序,一个服务器通常会给多个客户端同时提供服务. ...在mysql中提供了四个隔离级别.可以通过配置文件来设置当前服务器的隔离级别是哪个级别.
1.宽度优先遍历宽度优先遍历实际上对于我们的这个二叉树而言,实际上就是一层一层的进行这个遍历的过程,也就是按照这个第一层,第二层,第三层的顺序进行基本思想就是下面的这个样子的过程:初始化⼀个空的队列;根节点进入队列...,这个核心就是使用的我们的队列实现树的宽度优先遍历的这个过程;接下来我们还是以此来看一下这个vector数组和链式前向星两个方式对于我们的这个树进行宽度优先遍历的过程把,使用我们上面介绍的这个过程以及这个...,这个时候取出来这个队列里面的第一个元素,出队列;根据上面拿到的这个队列里面的第一个元素u进行遍历他的链表里面的元素进行遍历,使用的是auto语法,对于这个子节点,全部加入到这个队列里面去,并且标记位true...;3.链式前向星的宽度遍历接下来介绍一下这个链式前向星的遍历的方法,再来回顾一下,这个方法实际上就是定义这个h数组,我们的e数组和ne数组,以及这个id;首先是我们的这个里面的add函数,就是把这个b添加到这个...;h[u]就是找到我们的链表里面的虚拟头结点,进行下面的这个遍历的过程,for循环里面的这个ne[i[就是利用这个链表里面的next指针不断的找到我们的链表里面的下一个元素,找到的这个元素实际上就是u的孩子节点
(1.7)工程创建成功后,可以看到又一个小红叉,虽然不影响程序运行,但面对有强迫的我们,看着很少难受。选中工程:右键单击 --> Maven --> Update Project ?...小红叉已经被我们消灭了! ?...(2.6)重新 maven update 一下,小红叉就没有了(这里 JRE 我手动换成了自己常用的 jdk1.8)。 ?...(4.2)然后修改返回页面的语句,保存,你会发现项目可以自动重启了。 ? (4.3)并且也能访问成功,说明我们的热部署也已经配置成功了。 ?...(8.7)打开 user 表,我们可以发现界面的数据已经成功的帮我们保存到数据库中了。 ?
分析 原因就是limit offset这个语句,并不如人们望文生义想的那样,直接定位到第10000位然后取后面的100条记录。...而是令人发指的先一直一条一条读取到10100条,然后再根据offset的设置,舍弃前10000条记录,返回后面的100条记录。...那此时,实际上你不仅在无效遍历前10000个索引节点,MySQL还会让你去根据遍历到的这10000个无效索引节点去真正地查10000次数据,这就是10000次无效的数据查询。...因为MySQL的实现分为引擎层和数据层,limit offset只能作用于引擎层返回的结果集,因此对引擎层来说,他也不知道前10000个是会扔掉的数据,只能先一股脑地往上传。...经历的就是先根据条件找到10100条符合条件的记录(经过两个二叉树的查询),然后再抛弃前10000条。
索引的实现原理 B+tree 视频版-看着更方便: 哔哩哔哩 https://b23.tv/zVjcO3x 小红书 http://xhslink.com/HAW2ai 之前我讲了 树结构...的入门款 二叉树 而今天要说的 B+tree 则是专为 索引 而生的 基于 二叉树的一种变种树 那么 B+tree 也就是索引到底长啥样呢?...我们回看这个B+tree的结构 它和二叉树的区别在于 它是一种 多叉树 这种多叉的设计有什么好处呢?...这就是索引 使用B+tree的原因了 ok 那了解了 索引的原理 以及B+tree 结构之后 我们继续研究一下: 不同类型的索引 ->主键索引 顾名思义 围绕主键字段建立的索引 以mysql为例 当我们执行表创建语句的时候...在实际应用中 你可以使用 联合索引 + 覆盖索引 来优化查询语句 下面我用例子来演示一下应用的过程: 联合索引 + 覆盖索引 假设我现在想根据姓名查询颜值 select yanzhi from
原子性(Atomicity):一组操作,要么全部成功,要么全部失败 一致性(Consistency):对一组操作前后,数据会保持一致,比如小红给小刘转账一百元,转账前小红有100元,转账后小刘收到100...当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能执行。...在MySQL中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。...基于上面的说明,我们来讨论一下为什么建议你尽量不要使用长事务。 长事务意味着系统里面会存在很老的事务视图。...4.事务的启动方式 MySQL的事务启动方式有以下几种: 显示启动事务语句,begin或者start transaction。配套的提交语句是commit,回滚语句是rollback。
查询缓存 在解析一个查询语句前,如果查询缓存是打开的,那么MySQL会检查这个查询语句是否命中查询缓存中的数据。如果当前查询恰好命中查询缓存,在检查一次用户权限后直接返回缓存中的结果。...预处理则会根据MySQL规则进一步检查解析树是否合法。比如检查要查询的数据表和数据列是否存在等等。 查询优化 经过前面的步骤生成的语法树被认为是合法的了,并且由优化器将其转化成查询计划。...示例中的结果表示优化器认为大概需要做6391个数据页的随机查找才能完成上面的查询。...使用B-Tree这个术语,是因为MySQL在CREATE TABLE或其它语句中使用了这个关键字,但实际上不同的存储引擎可能使用不同的数据结构,比如InnoDB就是使用的B+Tree。...在介绍B+Tree前,先了解一下二叉查找树,它是一种经典的数据结构,其左子树的值总是小于根的值,右子树的值总是大于根的值,如下图①。
如果让你写一个简单牛叉的SQL,数据库类型不限,你会写出什么样的SQL语句。...我想了一个,比如Flashback database to sysdate-1/24/60; 这个我想表达的意思就是,数据库可以闪回到一分钟前,而我们的人生不会,统统不会。...MySQL MySQL的角度来写几个这方面的SQL自己还真想了不少,但是感觉都不是很满意,直到我看到了jeremycole 提供的一个MySQL性能测试语句,简单但是威力很大。...github上可以看到 https://github.com/jeremycole/yesmark 语句就一行: yes "DO 0;" | mysql >/dev/null & 如果想开个并行...for i in {1..16}; do yes "DO 0;" | mysql > /dev/null & done 这样的语句真实短小精悍。
注:该例子来自《MySQL 实战 45 讲》 覆盖索引 MySQL 5.7,建表语句: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL,...我们先从下面这组对比测试开始,将在 MySQL5.5 版本和 MySQL5.7 版本中执行同一条 SQL 语句: select * from employees where hire_date > '1990...我们先看下对比测试,以下测试语句在同一个 MySQL 实例下执行,执行前均进行 mysql 服务重启,以保证缓存此没被预热。...SQL 语句 A 的执行过程: 逐条扫描索引表并比较查询条件 遇到符合查询条件的则读取整行数据返回 回到 a 步骤,直至完成所有索引记录的比较 对返回的所有符合条件的记录(完整的记录)进行排序 选取前...(每条记录只有 3 个主键)进行排序 选取前 8000 条数据返回形成临时表 关联临时表与主表,使用主键相等比较查询 8000 条数据 对比两个 SQL 语句的执行过程,可以发现差异点集中在步骤 2 和步骤
1 索引简介 1.1 什么是 MySQL 的索引 官方定义:索引是帮助 MySQL 高效获取数据的数据结构 从上面定义中我们可以分析出索引本质是一个数据结构,他的作用是帮助我们高效获取数据,在正式介绍索引前...这种情况下,二叉树搜索性能就会降低 2.2.2 平衡二叉树 平衡二叉树又称AVL树。...这里回答了上面的问题,为什么 MySQL 一定要有主键索引,因为主键索引子节点中包含了全部数据 4.3 索引覆盖 CREATE TABLE `user` ( `id` int(11) NOT NULL...5.2 Explain 执行计划 通过上面的慢查询日志分析,我们可以知道有哪些慢 SQL 语句。...INTO `goods` VALUES (2, '电脑', 9888, '苹果电脑'); INSERT INTO `goods` VALUES (3, '衣服', 199, '好看的衣服'); 执行下面的查询语句
3.1 二叉树 假如说MySQL的索引结构采用二叉树的数据结构,比较理想的结构如下: 如果主键是顺序插入的,则会形成一个单向链表,结构如下 所以,如果选择二叉树作为索引结构,会存在以下缺点:...所以,在MySQL的索引结构中,并没有选择二叉树或者红黑树,而选择的是B+Tree,那么什么是 B+Tree呢?...第一个红框就是开启MySQL慢日志查询开关 ,第二个就是设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志。...而且中间不能跳过某一列,否则该列后面的字段索引将失效。 这里有一个思考题: 如果我进行sql语句编写,将age和status进行位置交换,这时候是否满足最左前缀法则?...6.3.4 or连接条件 用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
MySQL学习笔记地址:MySQL学习笔记500多页 在 11 月 11 日下午,对该业务的 SQL 语句进行了优化,优化的效果如下。...注:该例子来自《MySQL 实战 45 讲》 覆盖索引 MySQL 5.7,建表语句: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL,...我们先看下对比测试,以下测试语句在同一个 MySQL 实例下执行,执行前均进行 mysql 服务重启,以保证缓存此没被预热。...SQL 语句 A 的执行过程: 逐条扫描索引表并比较查询条件 遇到符合查询条件的则读取整行数据返回 回到 a 步骤,直至完成所有索引记录的比较 对返回的所有符合条件的记录(完整的记录)进行排序 选取前...(每条记录只有 3 个主键)进行排序 选取前 8000 条数据返回形成临时表 关联临时表与主表,使用主键相等比较查询 8000 条数据 对比两个 SQL 语句的执行过程,可以发现差异点集中在步骤 2 和步骤
,二叉树的层数会很深。...慢查询日志 查看是否开启慢查询日志 show variables like 'slow_query_log'; 如果没有开启,需要在mysql的配置文件中添加配置(注意是在Linux中输入语句,不是mysql...): vim /etc/my.cnf 然后在配置文件中添加下面两条语句: #开启mysql慢查询日志开关 slow_query_log=1 #设置慢查询的时间为2秒 long_query_time=...值越大越先执行) SELECT_Type 表示select的类型,常见的有:SIMP(简单表,即不使用表连接或者子查询),PRIMARY(主查询,即外层的查询),UNION(union中的第二个查询语句或者后面的查询语句...,or后面的字段没有索引,那么所有涉及的索引都不会被用到 数据分布影响 如果MySQL评价使用索引查询比比全表还慢,那么就不会使用索引 SQL提示 如果有多个索引存在,可以加入人为的提示,告诉MySQL
修改前效果图 ? 修改前 ? ?...我用的方法是" 启动 Network List Service "服务,现象及方法如下: 现象:网络连接的小图标上多了一个小红叉,但不影响上网,提示了服务 Network List Service 没有启动...安全 → 在 启动和激活权限 中 点击 自定义 4.编辑 → 添加 → 输入对象 名称 来选择 → 输入“LOCAL SERVICE” → 确定 5.返回【注意选择 LOCAL SERVIC】勾选下面的...本地激活 → 确定 6.回到组件服务 → 服务 → Network List Service → 右键启动 此时 Network List Service服务就可以正常启动,网络连接图标上的‘一把叉’
查询缓存 在解析一个查询语句前,如果查询缓存是打开的,那么MySQL会检查这个查询语句是否命中查询缓存中的数据。如果当前查询恰好命中查询缓存,在检查一次用户权限后直接返回缓存中的结果。...语法解析和预处理 MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。...使用B-Tree这个术语,是因为MySQL在CREATE TABLE或其它语句中使用了这个关键字,但实际上不同的存储引擎可能使用不同的数据结构,比如InnoDB就是使用的B+Tree。...在介绍B+Tree前,先了解一下二叉查找树,它是一种经典的数据结构,其左子树的值总是小于根的值,右子树的值总是大于根的值,如下图①。...至此我们可以考虑一个问题,平衡二叉树的查找效率还不错,实现也非常简单,相应的维护成本还能接受,为什么MySQL索引不直接使用平衡二叉树?
前言 前阵子面试的时候,在第三面问到了MySQL索引相关的知识点,并且给出了一些SQL语句分析索引的执行情况。...最左前缀原则 概念 还是以上面的这个联合索引为例,如果我的sql语句如下: 最左前缀原则:只要你的查询语句涉及的字段满足已有辅助索引的左侧出现顺序(或者匹配字符串的左侧n个字符),而不出现越过某个字段的情况...范围列可以用到索引,但是范围列后面的列无法用到索引。...解释:因为满足name like '小%'的记录可能有多条,而age字段的有序是建立的name有序的基础之上,上图中(小红, 15) (小红, 16) (小金, 17) (小兰, 16),单独看age字段之间是无序的...索引下推(MySQL5.6) 对于上面这个查询语句,因为sex字段是没有被联合索引覆盖,因此需要二次回表查询主键索引树,但是显然age字段的值是联合索引的一部分,且查询的是age等于16,而有些记录必然不符合匹配
如下面的==示意图==所示 : ? 左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。...为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。...到此,该BTREE树就已经构建完成了, BTREE树 和 二叉树 相比, 查询数据的效率更高, 因为对于相同的数据量来说,BTREE的层级结构比二叉树小,因此搜索速度快。...利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。...; 知识小贴士 DELIMITER 该关键字用来声明SQL语句的分隔符 , 告诉 MySQL 解释器,该段命令是否已经结束了,mysql是否可以执行了。
查询缓存 在解析一个查询语句前,如果查询缓存是打开的,那么MySQL会检查这个查询语句是否命中查询缓存中的数据。如果当前查询恰好命中查询缓存,在检查一次用户权限后直接返回缓存中的结果。...在介绍B+Tree前,先了解一下二叉查找树,它是一种经典的数据结构,其左子树的值总是小于根的值,右子树的值总是大于根的值,如下图①。...至此我们可以考虑一个问题,平衡二叉树的查找效率还不错,实现也非常简单,相应的维护成本还能接受,为什么MySQL索引不直接使用平衡二叉树?...以上面的示例来说明,比如有这样的一个查询: ? 假设MySQL按照查询中的关联顺序A、B来进行关联操作,那么可以用下面的伪代码表示MySQL如何完成这个查询: ?...考虑下面的查询: ? 如果这张表非常大,那么这个查询最好改成下面的样子: ?