题不少,先上题后上答案,便于你们思考css
问题点:html
一、C和C++的特色与区别?
二、C++的多态
三、虚函数实现
四、C和C++内存分配问题
五、协程
六、CGI的了解
七、进程间通讯方式和线程间通讯方式
八、TCP握手与释放
九、http和https的区别?
十、虚拟内存的概念与介绍
十一、单链表的反转算法
十二、红黑树以及其查找复杂度
1三、KPM字符串匹配
1四、TCP超时等待、重传以及流量控制
1五、数据库引擎
1六、数据库索引
一、C和C++的特色与区别?c++
答:(1)C语言特色:程序员
1.做为一种面向过程的结构化语言,易于调试和维护;面试
2.表现能力和处理能力极强,能够直接访问内存的物理地址;算法
3.C语言实现了对硬件的编程操做,也适合于应用软件的开发;数据库
4.C语言还具备效率高,可移植性强等特色。编程
(2)C++语言特色:数组
1.在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特色,又成为了一种面向对象的程序设计语言;浏览器
2.可使用抽象数据类型进行基于对象的编程;
3.可使用多继承、多态进行面向对象的编程;
4.能够担负起以模版为特征的泛型化编程。
C++与C语言的本质差异:在于C++是面向对象的,而C语言是面向过程的。或者说C++是在C语言的基础上增长了面向对象程序设
计的新内容,是对C语言的一次更重要的改革,使得C++成为软件开发的重要工具。
二、C++的多态
答:C++的多态性用一句话归纳:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来
调用相应的函数。若是对象类型是派生类,就调用派生类的函数;若是对象类型是基类,就调用基类的函数。
1):用virtual关键字申明的函数叫作虚函数,虚函数确定是类的成员函数;
2):存在虚函数的类都有一个一维的虚函数表叫作虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是
和对象对应的;
3):多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。;
4):多态用虚函数来实现,结合动态绑定.;
5):纯虚函数是虚函数再加上 = 0;
6):抽象类是指包括至少一个纯虚函数的类;
纯虚函数:virtual void fun()=0;即抽象类,必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。
三、虚函数实现
答:简单地说,每个含有虚函数(不管是其自己的,仍是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类
全部的虚函数对应的函数指针。例:
其中:
B的虚函数表中存放着B::foo和B::bar两个函数指针。
D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz。
虚函数表构造过程:
从编译器的角度来讲,B的虚函数表很好构造,D的虚函数表构造过程相对复杂。下面给出了构造D的虚函数表的一种方式(仅供参考):
虚函数调用过程
如下面的程序为例:
四、C和C++内存分配问题
答:(1)C语言编程中的内存基本构成
C的内存基本上分为4部分:静态存储区、堆区、栈区以及常量区。他们的功能不一样,对他们使用方式也就不一样。
1.栈 ——由编译器自动分配释放;
2.堆 ——通常由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;
3.全局区(静态区)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量
和未初始化的静态变量在相邻的另外一块区域(C++中已经再也不这样划分),程序结束释放;
4.另外还有一个专门放常量的地方,程序结束释放;
(a)函数体中定义的变量一般是在栈上;
(b)用malloc, calloc, realloc等分配内存的函数分配获得的就是在堆上;
(c)在全部函数体外定义的是全局量;
(d)加了static修饰符后无论在哪里都存放在全局区(静态区);
(e)在全部函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用;
(f)在函数体内定义的static表示只在该函数体内有效;
(g)另外,函数中的"adgfdf"这样的字符串存放在常量区。
(2)C++编程中的内存基本构造
在C++中内存分红5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区;
一、栈,就是那些由编译器在须要的时候分配,在不须要的时候自动清楚的变量的存储区,里面的变量一般是局部变量、函数参数等。
二、堆,就是那些由new分配的内存块,他们的释放编译器不去管,由咱们的应用程序去控制,通常一个new就要对应一个delete。如
果程序员没有释放掉,那么在程序结束后,操做系统会自动回收。
三、全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在之前的C语言中,全局变量又分为初始化的和未初始化的,在
C++里面没有这个区分了,他们共同占用同一块内存区。
四、常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不容许修改(固然,你要经过非正当手段也能够修改)。
五、代码区 (.text段),存放代码(如函数),不容许修改(相似常量存储区),但能够执行(不一样于常量存储区)。
内存模型组成部分:自由存储区,动态区、静态区;
根据c/c++对象生命周期不一样,c/c++的内存模型有三种不一样的内存区域,即:自由存储区,动态区、静态区。
自由存储区:局部非静态变量的存储区域,即日常所说的栈;
动态区: 用new ,malloc分配的内存,即日常所说的堆;
静态区:全局变量,静态变量,字符串常量存在的位置;
注:代码虽然占内存,但不属于c/c++内存模型的一部分;
一个正在运行着的C编译程序占用的内存分为5个部分:代码区、初始化数据区、未初始化数据区、堆区 和栈区;
(1)代码区(text segment):代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每一个进程),若是反复,则须要使用跳转指令,若是进行递归,则须要借助栈来实现。注意:代码区的指令中包括操做码和要操做的对象(或对象地址引用)。若是是当即数(即具体的数值,如5),将直接包含在代码中;
(2)全局初始化数据区/静态数据区(Data Segment):只初始化一次。
(3)未初始化数据区(BSS):在运行时改变其值。
(4)栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值等,其操做方式相似于数据结构中的栈。
(5)堆区(heap):用于动态内存分配。
为何分红这么多个区域?
主要基于如下考虑:
五、协程
答:定义:协程是一种用户态的轻量级线程。
协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。所以:协程能保留上一次调用时的状态(即全部局部状态的一个特定组合),每次过程重入时,就至关于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置;
线程是抢占式,而协程是协做式;
协程的优势:
跨平台
跨体系架构
无需线程上下文切换的开销
无需原子操做锁定及同步的开销
方便切换控制流,简化编程模型
高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。因此很适合用于高并发处理。
协程的缺点:
没法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程须要和进程配合才能运行在多CPU;
进行阻塞(Blocking)操做(如IO时)会阻塞掉整个程序:这一点和事件驱动同样,可使用异步IO操做来解决。
六、CGI的了解
答:CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。经过CGI接口,Web服务
器就可以获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
CGI通讯系统的组成是两部分:一部分是html页面,就是在用户端浏览器上显示的页面。另外一部分则是运行在服务器上的Cgi程序。
七、进程间通讯方式和线程间通讯方式
答:(1)进程间通讯方式:
管道( pipe ):管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。
信号量( semophore ) : 信号量是一个计数器,能够用来控制多个进程对共享资源的访问。它常做为一种锁机制,防止某进程正在访问共享资源时,其余进程也访问该资源。所以,主要做为进程间以及同一进程内不一样线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存( shared memory ) :共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号两,配合使用,来实现进程间的同步和通讯。
套接字( socket ) : 套解口也是一种进程间通讯机制,与其余通讯机制不一样的是,它可用于不一样及其间的进程通讯。
(2)线程间通讯方式:
八、TCP握手与释放
答:(1)握手
seq=y的包;
列号seq=z,主机B收到后确认ack值则链接创建成功;
注:上述步骤中,第二和第三次确认包中都还包含一个标志位未予以说明,该标志位为1表示正常应答;
具体可见图片:
为何须要“三次握手”?
“三次握手”的目的是“为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误”。具体例如:client发出的第一个链接请求报文段并无丢失,而是在某个网络结点长时间的滞留了,以至延误到链接释放之后的某个时间才到达server。原本这是一个早已失效的报文段。但server收到此失效的链接请求报文段后,就误认为是client再次发出的一个新的链接请求。因而就向client发出确认报文段,赞成创建链接。假设不采用“三次握手”,那么只要server发出确认,新的链接就创建了。因为如今client并无发出创建链接的请求,所以不会理睬server的确认,也不会向server发送数据。但server却觉得新的运输链接已经创建,并一直等待client发来数据。这样,server的不少资源就白白浪费掉了。采用“三次握手”的办法能够防止上述现象发生。例如刚才那种状况,client不会向server的确认发出确认。server因为收不到确认,就知道client并无要求创建链接。主要目的防止server端一直等待,浪费资源。
(2)挥手
因为TCP链接是全双工的,所以每一个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的链接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP链接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4);
(2) 服务器收到这个FIN,发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN同样,一个FIN将占用一个序号;
(3) 服务器关闭客户端的链接后,再发送一个FIN给客户端(报文段6);
(4) 客户段收到服务端的FIN后,发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7);
注意:TCP链接的任何一方均可以发起挥手操做,上述步骤只是两种之一;
具体过程见图:
为何是“四次挥手”?
由于当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你全部的数据都所有发送给对方了,因此你可能还须要发送一些数据给对方,再发送FIN报文给对方来表示你赞成如今能够关闭链接了,故这里的ACK报文和FIN报文多数状况下都是分开发送的,也就形成了4次挥手。
握手,挥手过程当中各状态介绍:
(1)3次握手过程状态:
(2)4次挥手过程状态:
九、http和https的区别?
答:HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议,与http主要区别在于:
下面具体介绍一下HTTP和HTTPS协议:
首先说明一下:HTTP和HTTPS协议是应用层协议;
上图充分代表:HTTP是应用层协议,而且HTTPS是在HTTP协议基础上添加SSL等加密策略后的协议;
TLS/SSL中使用了非对称加密,对称加密以及HASH算法。
(1)Http协议
1)HTTP协议和TCP协议之间的区别联系
①TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据;
②HTTP的默认端口号是80,TCP/IP协议通讯编程时端口号须要本身指定(例如socket编程);
③HTTP协议是在TCP/IP协议基础上实现的,即HTTP数据包是通过TCP/IP协议实现传输的;
④HTTP是无状态的短链接协议,TCP是有状态的长链接协议;
HTTP是在有状态长链接TCP/IP协议的基础上实现的,为何倒是无状态短链接协议?
答:由于HTTP协议每次请求结束就会自动关闭链接,这样就变成了短链接;
短链接又致使了该次请求相关信息的丢失,也就形成了HTTP协议对于前期事务处理没有记忆能力,故为无状态协议。
2)HTTP协议其完整的工做过程可分为四步:
①链接:首先客户机与服务器须要创建链接(由TCP/IP握手链接实现)。只要单击某个超级连接,HTTP的工做开始;
②请求:创建链接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容;
③应答:服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。客户端接收服务器所返回的信息经过浏览器显示在用户的显示屏上;
④关闭:当应答结束后,浏览器和服务器关闭链接,以保证其余浏览器能够与服务器进行链接。
更完整的过程可能以下:
域名解析 --> 发起TCP的3次握手 --> 创建TCP链接后发起http请求 --> 服务器响应http请求,浏览器获得html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。
若是在以上过程当中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来讲,这些过程是由HTTP本身完成的,用户只要用鼠标点击,等待信息显示就能够了。
(2)Https协议
HTTPS握手过程包括五步:
1)浏览器请求链接;
2)服务器返回证书:证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3)浏览器收到证书后做如下工做:
a) 验证证书的合法性;
b) 生成随机(对称)密码,取出证书中提供的公钥对随机密码加密;
c) 将以前生成的加密随机密码等信息发送给网站;
4)服务器收到消息后做如下的操做:
a) 使用本身的私钥解密浏览器用公钥加密后的消息,并验证HASH是否与浏览器发来的一致;
b) 使用加密的随机对称密码加密一段消息,发送给浏览器;
5)浏览器解密并计算握手消息的HASH:若是与服务端发来的HASH一致,此时握手过程结束,以后全部的通讯数据将由以前浏览
器生成的随机密码并利用对称加密算法进行加密。
注意:服务器有两个密钥,一个公钥、一个私钥,只有私钥才能够解密公钥加密的消息;
如图:
或者以下图:
HTTPS协议、SSL、和数字证书的关系介绍:
概述:对于HTTPS协议,全部的消息都是通过SSL协议方式加密,而支持加密的文件正是数字证书;
(1)SSL
SSL经常使用的加密算法:对称密码算法、非对称密码算法、散列算法;
SSL的加密过程:须要注意的是非对称加解密算法的效率要比对称加解密要低的多。因此SSL在握手过程当中使用非对称密码算法来
协商密钥,实际使用对称加解密的方法对http内容加密传输;
(2)数字证书
数字证书是用于在INTERNET上标识我的或者机构身份的一种技术手段,它经过由一些公认的权威机构所认证,从而能够保证其
安全地被应用在各类场合。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
十、虚拟内存的概念与介绍
答:虚拟内存中,容许将一个做业分屡次调入内存,须要时就调入,不须要的就先放在外存。所以,虚拟内存的实须要创建在离散
分配的内存管理方式的基础上。虚拟内存的实现有如下三种方式:
虚拟内存的意义:
一,虚拟内存可使得物理内存更加高效。虚拟内存使用置换方式,须要的页就置换进来,不须要的置换出去,使得内存中只保存了须要的页,提升了利用率,也避免了没必要要的写入与擦除;
二,使用虚拟地址可使内存的管理更加便捷。在程序编译的时候就会生成虚拟地址,该虚拟地址并非对应一个物理地址,使得也就极大地减小了地址被占用的冲突,减小管理难度;
三,为了安全性的考虑。在使用虚拟地址的时候,暴露给程序员永远都是虚拟地址,而具体的物理地址在哪里,这个只有系统才了解。这样就提
高了系统的封装性。
十一、单链表的反转算法
答:思想:建立3个指针,分别指向上一个节点、当前节点、下一个节点,遍历整个链表的同时,将正在访问的节点指向上一个节点,当遍历结束后,就同时完成了链表的反转。
实现代码:
ListNode* ReverseList(ListNode* pHead) { ListNode *p,*q,*r; if(pHead==NULL || pHead->next==NULL){ return pHead; }else{ p=pHead; q=p->next; pHead->next=NULL; while(q!=NULL){ r=q->next; q->next=p; p=q; q=r; } return p; } }
十二、红黑树以及其查找复杂度
答:(1)红黑树来源于二叉搜索树,其在关联容器如map中应用普遍,主要优点在于其查找、删除、插入时间复杂度小,但其也有缺点,就是容易偏向一边而变成一个链表。
红黑树是一种二叉查找树,但在每一个结点上增长一个存储位表示结点的颜色,能够是Red或Black。也就是说,红黑树是在二叉
查找树基础上进一步实现的;
红黑树的五个性质:
性质1. 节点是红色或黑色;
性质2. 根节点是黑色;
性质3 每一个叶节点(指树的末端的NIL指针节点或者空节点)是黑色的;
性质4 每一个红色节点的两个子节点都是黑色。(从每一个叶子到根的全部路径上不能有两个连续的红色节点);
性质5. 从任一节点到其每一个尾端NIL节点或者NULL节点的全部路径都包含相同数目的黑色节点。
(注:上述第三、5点性质中所说的NIL或者NULL结点,并不包含数据,只充当树的路径结束的标志,即此叶结点很是见的叶子结点)。
由于一棵由n个结点随机构造的二叉查找树的高度为lgn,因此瓜熟蒂落,二叉查找树的通常操做的执行时间为O(lgn)。但二叉查
找树若退化成了一棵具备n个结点的线性链后,则这些操做最坏状况运行时间为O(n);
红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增长以上五个性质使得红黑树相对平衡,从而保证了
红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。
(2)左旋右旋
红黑树插入或删除后,通常就会改变红黑树的特性,要恢复红黑树上述5个性质,通常都要那就要作2方面的工做:
一、部分结点颜色,从新着色
二、调整部分指针的指向,即左旋、右旋。
左选右旋如图所示:
左旋,如图所示(左->右),以x->y之间的链为“支轴”进行,使y成为该新子树的根,x成为y的左孩子,而y的左孩子则成为x的右孩
子。算法很简单,旋转后各个结点从左往右,仍然都是从小到大。
左旋代码实现,分三步:
(1) 开始变化,y的左孩子成为x的右孩子;
(2) y成为x的父结点;
(3) x成为y的左孩子;
右旋相似,再也不累述;
1三、KPM字符串匹配
(1)KMP匹配算法代码实现:
int KmpSearch(char s, char p)
{
int i = 0;
int j = 0;
int sLen = strlen(s);
int pLen = strlen(p);
while (i < sLen && j < pLen)
{
//①若是j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++
if (j == -1 || s[i] == p[j])
{
i++;
j++;
}
else
{
//②若是j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]
//next[j]即为j所对应的next值
j = next[j];
}
}
if (j == pLen)
return i - j;
else
return -1;
}
(2)next数组求取
上述(1)中最重要的就是:一旦不匹配,模式串不是向后移动一位,而是根据前面匹配信息移动多位。而这个多位得到就是根据next数组,下面有next数组的求取方式:
Next数组是根据模式串的前缀后缀获取的,以下:
①寻找前缀后缀最长公共元素长度
举个例子,若是给定的模式串为“abab”,那么它的各个子串的前缀后缀的公共元素的最大长度以下表格所示:
好比对于字符串aba来讲,它有长度为1的相同前缀后缀a;而对于字符串abab来讲,它有长度为2的相同前缀后缀ab(相同前缀后缀的长度为k + 1,k + 1 = 2)。
②求next数组
next 数组考虑的是除当前字符外的最长相同前缀后缀,因此经过第①步骤求得各个前缀后缀的公共元素的最大长度后,只要稍做变形便可:将第①步骤中求得的数组总体右移一位,而后第一个元素赋为-1便可(注意:字符串下标须要从0开始),以下表格所示:
好比对于aba来讲,第3个字符a以前的字符串ab中有长度为0的相同前缀后缀,因此第3个字符a对应的next值为0;而对于abab来讲,第4个字符b以前的字符串aba中有长度为1的相同前缀后缀a,因此第4个字符b对应的next值为1(相同前缀后缀的长度为k,k = 1)。
KMP的next 数组至关于告诉咱们:当模式串中的某个字符跟文本串中的某个字符匹配失配时,模式串下一步应该跳到哪一个位置(具体:保持测试串的下标i不变,使得匹配串的下标j=next[j])。
前缀后缀长度求取以及next数组获取:
若是给定的模式串是:“ABCDABD”,从左至右遍历整个模式串,其各个子串的前缀后缀分别以下表格所示:
也就是说,原模式串子串对应的各个前缀后缀的公共元素的最大长度表为:
0 0 0 0 1 2 0;
故对应的next数组为:-1 0 0 0 0 1 2;
(注意:这里的字符串下标是从0开始的,若从1开始,next数组全部元素都对应要加1。)
求取next的实现代码:
string T; //T为模式串
cin>>T;
int len=T.size();
queue<int> MaxLen;
vector<int> next;
MaxLen.push(0); //第一个元素都设为0
for(int i=1;i<len;i++)
{
int k=1,maxLen=0;
while(k<=i)
{
if(T.substr(0,k)==T.substr(i-k+1,k))
{
maxLen=k;
}
k++;
}
MaxLen.push(maxLen);
}
cout<<endl;
next.push_back(-1); //第一个元素都设为-1
while(MaxLen.size()>1)
{
int temp=MaxLen.front();
next.push_back(temp);
MaxLen.pop();
cout<<temp<<' ';
}
1四、TCP超时等待、重传以及流量控制
答:TCP等待时间须要设定,超过了就认为丢包,须要重传;
为了防止拥塞状况,通常会采用流量控制,其实现手段是用滑动窗口限制客户端发送分组数量;
1五、数据库引擎
答:数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而知足企业内大多
数须要处理大量数据的应用程序的要求。
简言之,数据库引擎就是一段用于支撑全部数据库操做的核心程序,就如名称同样,是一个车的引擎功能;
常见的数据库引擎有:
(1)Microsoft JET (Joint Engineering Technologe) 用于Access和VB的内嵌数据库功能的核心元素;
(2)ODBC(Open DataBase Connectivity,开放数据库互连)是由Microsoft定义的一种数据库访问标准,它提供一种标准的数据
库访问方法以访问不一样平台的数据库。一个ODBC应用程序既能够访问在本地PC机上的数据库,也能够访问多种异构平台上的数据
库,例如SQL Server、Oracle或者DB2;
(3)OLE DB是Microsoft开发的最新数据库访问接口,Microsoft将其定义为ODBC接班人;
(4)MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB)也经常可使用;
①ISAM执行读取操做的速度很快,并且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不 支持事务处理,也不可以容错;
②MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎MYISAM。除了提供ISAM里所没有的索引和字段管理的大量功能,
MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操做,其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新
机制所浪费的空间;
③HEAP容许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,可是它所管理的数据是不稳定的,
并且若是在关机以前没有进行保存,那么全部的数据都会丢失。
1六、数据库索引
答:定义:数据库索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息;
举例:employee 表的人员编号列(id)就是数据库索引,select * from employee where id=10000便可查找编号10000的人员信息。若是没有索引,必须遍历整个表直到id=10000;
数据库索引做用:
一,大大加快 数据的检索速度,这也是建立索引的最主要的缘由;
二,保证数据库表中每一行数据的惟一性;
三,能够加速表和表之间的链接,特别是在实现数据的参考完整性方面特别有意义;
四,在使用分组和排序子句进行数据检索时,一样能够显著减小查询中分组和排序的时间;
五,经过使用索引,能够在查询的过程当中,使用优化隐藏器,提升系统的性能。
数据库索引缺陷:
一,表的增删改查、建立索引和维护索引要耗费时间;
二,索引须要占物理空间;
数据库索引的两个特征:索引有两个特征,即惟一性索引和复合索引;
①惟一 性索引保证在索引列中的所有数据是惟一的,不会包含冗余数据;
②复合索引就是一个索引建立在两个列或者多个列上,搜索时须要两个或者多个索引列做为一个关键值;
数据库索引比如是一本书前面的目录,索引分为聚簇索引和非聚簇索引两类:
1)聚簇索引是按照数据存放的物理位置为顺序的,其多个连续行的访问速度更快;
2)非聚簇索引是按照数据存放的逻辑位置为顺序的,其单行访问速度更快;
局部性原理与磁盘预读
局部性原理:当一个数据被用到时,其附近的数据也一般会立刻被使用。程序运行期间所须要的数据一般比较集中;
磁盘预读:正是因为局部性原理以及数据存储磁盘的读写速度慢的缘由,每次对数据库进行读取都不是按需读取,而是读取多
于需求数据区域内的数据到内存,用于后续使用,提升写读取数据速度;
注:磁盘预读通常都是每次读取逻辑上的一页,或物理上的一块,无论实际需求是多少;
数据库索引的实现一般使用B树及其变种B+树,下面进行B-/+Tree结构的数据库索引的性能分析:
(1)B树索引结构:
数据库系统的设计者巧妙利用了磁盘预读原理,将B树的一个节点的大小设为等于一个页,这样每一个节点只须要一次I/O就能够
彻底载入。为了达到这个目的,在实际实现B-Tree还须要使用以下技巧:
——每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页;
B-Tree中一次检索最多须要h-1次I/O(磁盘IO不包括根节点,由于根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一
般实际应用中,出度d是很是大的数字,一般超过100,所以h很是小(一般不超过3)。
而红黑树这种结构,h明显要深的多。因为逻辑上很近的节点(父子)物理上可能很远,没法利用局部性,因此红黑树的I/O渐进
复杂度也为O(h),效率明显比B-Tree差不少。
因此,B树结构的数据库索引,在元素查找上效率很高;
(2)B+树的索引结构:
B+树则适当牺牲检索的时间复杂度(都必须检索到叶子结点),但改善了节点插入和删除的时间复杂度(相似用链表改善数组的效
果),因此B+树属于一种折中选择。