MySQL存储引擎
说一说执行一条查询SQL查询语句的过程 会经过连接器、查询缓存、解析器、优化器、执行器、存储引擎这些模块 连接器负责建立连接、校验用户身份、接受客户端的SQL语句 在查询缓存中,如果命中缓存,直接返回 分析器对SQL语句进行语法分析、词法分析 优化器会基于查询成本的考虑,对每个索引进行成本分析,从中选择查询成本最小的执行计划。同时缓存记录给查询缓存 执行器会根据执行计划来执行查询语句,从存储引擎中读取记录,返回给客户端 MySQL存储引擎有哪些有InnoDB、MyISAM、Memory InnoDB是MySQL默认的存储引擎,支持事务、行级锁,具有事务提交、回滚和崩溃恢复功能 MyISAM和InnoDB有什么区别从数据存储、B+树结构、锁粒度、事务这四个角度来分析 数据存储:InnoDB存储数据采取的是索引组织表,在索引组织表中,索引即数据,数据即索引,因此表数据和索引数据在同一个文件中。MyISAN存储数据采用的是堆表,数据和索引分开存储,因此表数据和索引数据分别放在不同的两个文件中 索引组织表有两个优势:1....
MySQL索引应用
...
MySQL索引结构
MySQL有哪些索引结构(按数据结构分类) B+树结构:B+树索引是一种平衡树数据结构,它将数据按照索引键值有序地存储在叶子节点上,非叶子节点只存储索引键值的范围和指向下一层结点的指针。因此查找、排序的效率很高。保存千万级别的数据,B+树一般只需要3-4层,也就是查询一条记录,只需要3-4次的磁盘IO 哈希索引:通过哈希表实现,查询时间复杂度是O(1),但不支持排序,模糊查询,范围查询等 全文索引:用于全文搜索的索引技术,可以对文本内容进行搜索,支持关键词的模糊匹配和搜索 InnoDB存储引擎支持的索引数据结构支持B+树数据结构: 数据组织索引:B+树非叶子节点存储索引范围和指向下一层的节点,叶子节点存储索引键值和行数据,因此B+树索引属于聚簇索引 叶子节点链表:所有叶子节点通过指针相连,形成一个双向链表,支持快速的顺序访问和范围查询 平衡树结构:所有叶子节点在同一层上,数的高度平衡,即使是千万级数据,也只有3-4层,查询、排序的效率高 从数据页角度看B+树 InnoDB 的数据是按「数据页」为单位来读写的,默认数据页大小为 16...
SpringBoot注解
Bean处理依赖注入 @Autowired: 用在属性和方法上。依赖注入,把配置好的bean拿来用 @Resource:默认情况下@Resource按照名称注入,如果没有显式声明名称则按照变量名称或者方法中对应的参数名称进行注入 @Qualifier: 标注类被Spring容器管理 @Component:组件,当组件不好归类的时候使用 @Respository:持久层,用于DAO类 @Service:服务层,用于Service类,通常需要注入DAO层 @Controller:MVC控制层Bean,常需要注入Service层 @RestController:继承@Controller注解,用于开发REST服务,直接将返回值当作json格式,通过body来给他返回。在使用 @RestController 注解标记的类中,每个方法的返回值都会以 JSON 或 XML 的形式直接写入 HTTP 响应体中,相当于在每个方法上都添加了 @ResponseBody...
从前序与中序遍历序列构造二叉树
该题主要是通过前序和中序遍历来还原一颗二叉树,核心的思路:在前序中找到根节点,根据该节点在中序遍历数组中的位置,根据中序划分左右子树,递归这个过程,还原一颗二叉树 本质上就是前序遍历中依次拿,不断地从中序遍历数组中缩小范围,范围为空的时候代表该范围拿不到了,需要换一颗子树。二叉树遍历的特点保证了前序遍历拿的元素一定可以在范围内找到 123456789101112131415161718192021222324252627282930struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode() : val(0), left(nullptr), right(nullptr) {}; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}; TreeNode(int x, TreeNode* left, TreeNode* right) : val(x),...
LRU缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字 函数 get 和 put 必须以 O(1) 的平均时间复杂度运行 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152class LRUCache {public: unordered_map<int, int> mp; ...
最长回文子串——区间dp
12345678910111213141516171819202122232425262728class Solution {public: string longestPalindrome(string s) { int n = s.size(); vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0)); // dp[i][j] = dp[i + 1][j - 1] string ans = ""; int idx = 0; int m = 0; for (int i = n - 1; i >= 0; i--) { for (int j = i; j < n; j++) { if (s[i] == s[j]) { if...
ACM算法模板
起手式12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697#include <bits/stdc++.h>using namespace std;#define int long long#define ull unsigned long long#define all(x) x.begin(), x.end()#define vi vector#define pb push_back#define pii pair<int, int>#define x first#define y second#define endl '\n'// inline int read() {// register int...
最小覆盖子串——滑动窗口
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量 如果 s 中存在这样的子串,我们保证它是唯一的答案 滑动窗口区间[j, i] 初始i = j = 0, 直接添加第一个 i永远一步一步来,j根据条件改变,尽量让窗口变小,但是不能不满足条件 结束的时候是i越界 123456789101112131415161718192021222324class Solution {public: string minWindow(string s, string t) { string ans = ""; unordered_map<char, int> mp; for (auto ch : t) mp[ch]++; unordered_map<char,...
传输层协议
以下部分图片节选自小林coding,有侵权问题必删 传输层概述 传输层的两个重要协议TCP和UDP TCP: 面向连接 可靠连接 基于字节流 仅支持单播 UDP: 无连接 面向报文 支持单薄、广播、多播 不可靠 传输层复用、分用和端口 用户数据报协议(User Datagram Protocol,...