MySQL索引
索引概述索引(index)是帮助MySQL高效获取数据的数据结构(有序)。
索引优缺点
索引数据结构
Btree(多路平衡树)二叉树:顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较深,检索速度慢。
红黑树:大数据量情况下,层级较深,检索速度慢。
B树: m叉树
树中每个结点中至多有m个孩子结点(至多有m-1个关键字)
2=<根节点孩子树<=m
ceil(m/2)=<非叶子结点孩子树<=m
所有叶子结点在同一层上
B+树与B树的区别
所有数据都在叶子结点
叶子结点形成一个单向链表
MySQL中B+树进行了优化,叶子结点由双链表串联。
Hash特点:
只能用于对等比较,不支持范围查询
无法利用索引完成排序操作
查询效率高,通常只需要一次检索就可以了,效率通常比B+树索引
为什么InnoDB存储引擎选择使用B+索引结构
相对于二叉树,层级更少,搜索效率高;
对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储 的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能 ...
软件测试
测试定义
使用人工或者自动的手段来运行或者测试某个系统的过程
目的在于检验它是否满足规定的需求(弄清预期结果和实际结果的差别)
测试目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷。
测试的原则
证明软件中存在缺陷
不能穷尽测试
测试应该尽早介入
28原则(80%的用户只用到了20%的功能,80%的错误出现在20%的地方)
不存在缺陷谬论(程序一定有缺陷)
妥善保存一切文档
测试标准国际标准25010、国内标准GBT18905
测试的基本要求
外观界面测试
易用测试
兼容性测试
安全性测试
性能测试
功能测试
测试的工作流程
需求分析(阅读需求文档,分析需求的点,参与需求评审)
测试计划和测试方案(宏观计划和实际方案)
测试用例设计
测试用例执行
评估阶段 测试报告
开发模式瀑布模型
优点:
为项目提供了按阶段划分的检查点
可在迭代模型中应用瀑布模型
当前阶段完成后,只需要关注后序阶段
缺点:
不适合需求变动多的项目
成品消耗较多时间
灵活性较差
适合项目类型:学生管理模型、银行系统
增量模型定义:把瀑布模型的顺序 ...
Docker入门
基本概念Docker是一个用于构建(build)、运行(run)、传送(share)应用程序的平台。有了Docker就可以将应用程序和它运行时所需要的各种依赖包、第三方软件库、配置文件等打包在一起,以便在任何环境都可以正确运行。
为什么使用Docker未使用Docker时,浪费大量的时间在配置环境上
使用Docker后,可以将配置步骤打包,只要在开发环境中运行成功,测试环境也是可以成功运行的。
Docker和虚拟机的区别虚拟机
虚拟机的实现是基于虚拟化技术,它是一种将物理资源虚拟成多个逻辑资源的技术。它可以将一台物理服务器虚拟成多个虚拟化服务器。每个逻辑服务器都可以有自己的操作系统、CPU、内存、硬盘和网络接口等等,可以独立运行。不过缺点明显,若我们只需要Web服务器,但是虚拟机却需要启动一个完整的系统,包括系统的内核、各种工具甚至图形界面等等,这会导致资源浪费和启动速度慢的问题。
Docker
Docker和容器是两种不同的概念,其实Docker只是容器的一种实现,是一种容器化的解决方案和平台,而容器是一种虚拟化技术和虚拟机类似,也是一种独立的环境,可以在这个环境运行应用程序。 ...
KMP
next数组求解next数组也就是最长前后缀表
STL常用算法
删除队列的某个元素#include<bits/stdc++.h>using namespace std;int main(){ //删除字符串全部逗号 string s="1,3,4,5"; s.erase(remove(s.begin(),s.end(),','),s.end()); cout<<s<<endl; //删除vector中的某个元素 vector<int> v={1,3,4,3,6}; v.erase(remove(v.begin(),v.end(),3),v.end()); for(int i=0; i<v.size(); i++) cout<<v[i]<<" "; cout<<endl; return 0;}
删除字符串的前导0#include<iostream>using namespace std;int ...
STL双端队列
#include<deque>#include<iostream>using namespace std;int main(){ deque<int> d={1,2,3,4}; //访问首尾元素 cout<<d.front()<<" "<<d.back()<<endl; cout<<*d.begin()<<" "<<*(d.end()-1)<<endl; cout<<d[0]<<" "<<d[3]<<endl; //添加头部元素 d.push_front(0); //添加尾部元素 d.push_back(5); for(auto &x: d) cout<<x<<" "; cout<<endl; ...
epoll
epoll函数epoll_create
epoll_wait
快速幂
举个简单的例子理解一下吧,比如pow(5,13),正常算的话需要执行乘法15次吧。可是如果采用快速幂,只要进行只要四次运算就ok了。13的二进制为1101,每一位分别代表8,4,2,1。
5^{13}=5^1*5^0*5^4*5^8原理很简单,x每轮都自乘,若遇到当前二进制为1的话,就乘与x。有点词穷了,附上代码赋值理解吧。
class Solution {public: double myPow(double x, int n) { //位运算 if(x==0) return 0; long b=n; double res=1; //如果n小于0,等与pow(1/x,-n) if(b<0){ x=1/x; b=-b; } while(b>0) { if((b&1)==1) res*=x; x*=x ...
一切才刚刚开始
记录一下今天,今天早上投了20多份简历,不过几乎都石沉大海了。心中难免浮出一片悲凉,感觉前路漫漫。于是和一位网友诉苦,她的一句话也确实点醒了我。她说,现在虽然没有稳定工作但是你最起码可以享受找工作的过程 可以有目标 ,如果你现在就稳定工作 可能你还是去了很多更好的机会 失去了过程中的快乐。听到这话我也有了一丝的宽慰,又想起来我那个倒霉蛋哥们,一年了也没收到几个offer。而我呢,还没找多久呢,怎么可以轻言失败呢。一切才刚刚开始呢。以下就是我网上找的鸡汤文。
当你以为一切都将要结束的时候,其实一切才刚刚开始。其实人生很多时候都不是如意的,很多时候都觉得现在特别难。不过仔细回想一下,当初你觉得很难,觉得不可能度过的那段时间,是不是也刷的一下过去了。现在回想起来甚至想不起来,当初为什么觉得那么难了。也许很多时候不能把时间放在无意义的内耗上,不妨走出去,呼吸一下新鲜空气,或许就有不同的感受了。
最后啊,再来晚毒鸡汤。当你觉得一切才刚刚开始的时候,挑战已经结束了。哈哈哈!