并发编程:线程、进程、队列、IO多路模型 操做系统工做原理介绍、线程、进程演化史、特色、区别、互斥锁、信号、 事件、join、GIL、进程间通讯、管道、队列。 生产者消息者模型、异步模型、IO多路复用模型、select\poll\epoll 高性 能IO模型源码实例解析、高并发FTP server开发
1,简述计算机操做系统的中断的做用html
中断装置由一些特定的寄存器和控制线路组成,中央处理器和外围设备等识别到的 事件保存在特定的寄存器中。 中央处理器每执行完一条指令,均由中断装置判别是否有事件发生。 若无事件发生,CPU继续执行; 如有事件发生,则中断装置中断原占有CPU的程序的执行,让操做系统的处理事件 服务程序占用CPU,对出现的事件进行处理,事件处理完后,再让原来的程序继续占用CPU执行
中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件, 使得cpu暂时中断当前正在执行的程序,转去执行相应的事件处理程序。待处理完毕 后又返回原来被中断处继续执行或调度新的进程执行的过程。它使计算机能够更好更 快利用有限的系统资源解决系统响应速度和运行效率的一种控制技术。实时响应,系统调度。
2,简述计算机内存的“内核态”和“用户态”python
内核态:cpu能够访问内存的全部数据,包括外围设备, 例如硬盘,网卡,cpu也能够将本身从一个程序切换到另外一个程序。 用户态:只能受限的访问内存,且不容许访问外围设备,占用cpu的能力被剥夺, cpu资源能够被其余程序获取
3,为何要有内核态和用户态?mysql
因为须要限制不一样的程序之间的访问能力,防止他们获取别的程序的内存数据, 或者获取外围设备的数据,并发送到网络 cpu划分出两个权限等级:用户态和内核态。
4,什么是进程?linux
正在执行的一个程序或者说一个任务,负责执行任务的是cpu。 进程是用来把资源集中到一块儿的,进程是资源单位,或者说资源集合。
5,什么是线程?程序员
线程是cpu上的执行单位。同一个进程内的多个线程共享该进程内的地址资源。 建立线程的开销要远小于建立进程的开销。 线程是操做系统可以进行运算调度的最小单位。 它被包含在进程之中,是进程中的实际运做单位。 一条线程指的是进程中一个单一顺序的控制流,一个进程中能够并发多个线程, 每条线程并行执行不一样的任务
6,什么是系统调用?web
全部用户程序都是运行在用户态的,可是有时候程序确实须要作一些内核态的事情, 例如从硬盘读取数据,或者从键盘获取输入等, 而惟一能作这些事情的就是操做系统,因此此时程序就须要向操做系统请求以程序 的名义来执行这些操做。这时,就须要一个机制:用户态程序切换到内核态,可是不能 控制在内核态中执行的指令。这种机制就叫系统调用。
7,threading模块event和condition的区别;算法
condition: 某些事件触发或达到特定的条件后才处理数据,默认建立了一个lock对象。 con = threading.Condition() con.acquire() con.notify() con.wait() con.release() event:其余线程须要经过判断某个线程的状态来肯定本身的下一步操做,就能够用event。 from threading import Event event = Event() event.set(): 设置event的状态值为True,全部阻塞池的线程激活进入就绪状态, 等待操做系统调度; event.is_set():返回event的状态值; event.wait():若是 event.is_set()==False将阻塞线程; event.clear():恢复event的状态值为False。
8,进程间通讯方式有哪些?sql
消息队列 管道 信号量 信号 共享内存 套接字
9,简述对管道,队列的理解数据库
队列 = 管道 + 锁 from multiprocessing import Queue,Process queue = Queue() queue.put(url) url = queue.get() from multiprocessing import Pipe,Process pipe = Pipe() pipe.send(url) pipe.recv()
10,请简述你对join、daemon方法的理解,举出它们在生产环境中的使用场景;编程
join: 等待一个任务执行完毕;能够将并发变成串行。 daemon: 守护进程(守护线程)会等待主进程(主线程)运行完毕后被销毁。 运行完毕: 1.对主进程来讲,运行完毕指的是主进程代码运行完毕。 2.对主线程来讲,运行完毕指的是主线程所在的进程内全部非守 护线程通通运行完毕,主线程才算运行完毕。
11,简述IO多路复用模型的工做原理
IO多路复用实际上就是用select,poll,epoll监听多个io对象,当io对象有 变化(有数据)的时候就通知用户进程。好处就是单个进程能够处理多个socket。 1.当用户进程调用了select,那么整个进程会被block; 2.而同时,kernel会“监视”全部select负责的socket; 3.当任何一个socket中的数据准备好了,select就会返回; 4.这个时候用户进程再调用read操做,将数据从kernel拷贝到用户进程。 总结: 1.I/O 多路复用的特色是经过一种机制一个进程能同时等待多个文件描述符, 而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态, select()函数就能够返回。 2.IO多路复用:须要两个系统调用,system call (select 和 recvfrom), 而blocking IO只调用了一个system call (recvfrom)。可是,用select的优点 在于它能够同时处理多个connection。 3.若是处理的链接数不是很高的话,使用select/epoll的web server不必定 比使用多线程 + 阻塞 IO的web server性能更好,可能延迟还更大。 4.select/epoll的优点并非对于单个链接能处理得更快,而是在于能处理更多的链接。
12,threading中Lock和RLock的相同点和不一样点
Lock():互斥锁,只能被acquire一次,可能会发生死锁状况。 RLock():递归锁,能够连续acquire屡次。 RLock = Lock + counter counter:记录了acquire的次数,直到一个线程全部的acquire都被release,其余线程才能得到资源。
1三、什么是select,请简述它的工做原理,简述它的优缺点;
python中的select模块专一于I/O多路复用,提供了select poll epoll三个方法;后两个在linux中可用, windows仅支持select。 fd:文件描述符 fd_r_list,fd_w_list,fd_e_list = select.select(rlist,wlist,xlist,[timeout]) 参数:可接受四个参数(前三个必须) rlist:等到准备好阅读 wlist:等到准备写做 xlist:等待“异常状况” 超时:超时时间 返回值:三个列表 select监听fd变化的过程分析: 用户进程建立socket对象,拷贝监听的fd到内核空间,每个fd会对应一张系统文件表, 内核空间的fd响应到数据后, 就会发送信号给用户进程数据已到; 用户进程再发送系统调用,好比(accept)将内核空间的数据copy到用户空间,同时做 为接受数据端内核空间的数据清除, 这样从新监听时fd再有新的数据又能够响应到了(发送端由于基于TCP协议因此须要收到 应答后才会清除)。 该模型的优势: 相比其余模型,使用select() 的事件驱动模型只用单线程(进程)执行,占用资源少, 不消耗太多 CPU,同时可以为多客户端提供服务。 若是试图创建一个简单的事件驱动的服务器程序,这个模型有必定的参考价值。 该模型的缺点: 首先select()接口并非实现“事件驱动”的最好选择。由于当须要探测的句柄值较大时, select()接口自己须要消耗大量时间去轮询各个句柄。 不少操做系统提供了更为高效的接口,如linux提供了epoll,BSD提供了kqueue, Solaris提供了/dev/poll,…。 若是须要实现更高效的服务器程序,相似epoll这样的接口更被推荐。遗憾的是不一样 的操做系统特供的epoll接口有很大差别, 因此使用相似于epoll的接口实现具备较好跨平台能力的服务器会比较困难。 其次,该模型将事件探测和事件响应夹杂在一块儿,一旦事件响应的执行体庞大,则 对整个模型是灾难性的。
1四、什么是epoll,请简述它的工做原理,简述它的优缺点;
epoll: 性能最好的多路复用I/O就绪通知方法。相比于select,epoll最大的 好处在于它不会随着监听fd数目的增加而下降效率。 由于在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,天然耗时越多。 epoll:一样只告知那些就绪的文件描述符,并且当咱们调用epoll_wait()得到就绪文件描述符时, 返回的不是实际的描述符,而是一个表明就绪描述符数量的值, 你只须要去epoll指定的一个数组中依次取得相应数量的文件描述符便可,这里也使用了内存映射(mmap)技术,这样便完全省掉了这些文件描述符在系统调用时复制的开销。 另外一个本质的改进在于epoll采用基于事件的就绪通知方式。在select/poll中,进程只有在调用 必定的方法后,内核才对全部监视的文件描述符进行扫描, 而epoll事先经过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会 采用相似callback的回调机制,迅速激活这个文件描述符, 当进程调用epoll_wait()时便获得通知。从以上可知,epoll是对select、poll模型的改进, 提升了网络编程的性能,普遍应用于大规模并发请求的C/S架构中。 python中的epoll: 只适用于unix/linux操做系统
1五、简述select和epoll的区别;
select 是不断轮询去监听的socket,socket个数有限制,通常为1024个; poll仍是采用轮询方式去监听,只不过没有个数限制。 epoll并不用采用轮询方式去监听,而是当socket有变化时经过回调方式主动告知用户进程。 select支持多平台,epoll只支持linux平台。
select: 调用select()时 一、上下文切换转换为内核态 二、将fd从用户空间复制到内核空间 三、内核遍历全部fd,查看其对应事件是否发生 四、若是没发生,将进程阻塞,当设备驱动产生中断或者timeout时间后,将进程唤醒,再次进行遍历 五、返回遍历后的fd 六、将fd从内核空间复制到用户空间 select: 缺点 一、当文件描述符过多时,文件描述符在用户空间与内核空间进行copy会很费时 二、当文件描述符过多时,内核对文件描述符的遍历也很浪费时间 三、select最大仅仅支持1024个文件描述符 epoll很好的改进了select: 一、epoll的解决方案在epoll_ctl函数中。每次注册新的事件到epoll句柄中时, 会把全部的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。epoll保证了每 个fd在整个过程当中只会拷贝一次。 二、epoll会在epoll_ctl时把指定的fd遍历一遍(这一遍必不可少)并为每一个fd 指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调 函数,而这个回调函数会把就绪的fd加入一个就绪链表。 epoll_wait的工做实际上就是在这个就绪链表中查看有没有就绪的fd。 三、epoll对文件描述符没有额外限制。
1六、简述多线程和多进程的使用场景;
多进程用于计算密集型,如金融分析;利用多核实现并发。 多线程用于IO密集型,如socket,爬虫,web。
17,请分别简述threading.Condition、threading.event、threading.semaphore的使用场景;
condition: 某些事件触发或达到特定的条件后才处理数据。 event: 用来通知线程有一些事情已发生,从而启动后继任务的开始。 semaphore: 为控制一个具备有限数量用户资源而设计。
1八、假设有一个名为threading_test.py的程序里有一个li = [1, 2, 3, 4]的列表,另有a,b两个函数分别往该列表中增长元素,a函数须要修改li以前须要得到threading.Lock对象,b函数不须要,请问当线程t1执行a函数获取到Lock对象以后并无release该对象的状况下,线程t2执行b函是否能够修改li,为何?
能够,线程的数据是共享的,a 函数虽然上了锁,没有释放。因为b 函数不须要上锁,就能够访问资源。
1九、简述你对Python GIL的理解;
GIL(global interpreter lock)全局解释器锁 GIL是CPython的一个概念,本质是一把互斥锁,将并发运行变成串行。 解释器的代码是全部线程共享的,因此垃圾回收线程也有可能访问到解释器的代码去执行。 所以须要有GIL锁,保证python解释器同一时间只能执行一个任务的代码。 GIL:解释器级别的锁(保护的是解释器级别的数据,好比垃圾回收的数据) Lock:应用程序的锁(保护用户本身开发的应用程序的数据)
20、什么是同步I/O,什么是异步I/O?
synchronous io: 作”IO operation”的时候会将process阻塞;”IO operation”是指真实的IO操做 blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO这一类. asynchronous io: 当进程发起IO 操做以后,就直接返回不再理睬了,直到kernel发送一个信号, 告诉进程说IO完成。在这整个过程当中,进程彻底没有被block。 异步io的实现会负责把数据从内核拷贝到用户空间。
各类I/O模型比较 有没有办法能让咱们在I/O时,不让咱们的应用程序阻塞;从上边的分析咱们知道 向内核发起一个I/O操做,要通过等待fd就绪+内核数据到用户数据区复制,完成一次I/O; Linux POSIX是这样定义同步I/O 和 异步I/O的: 同步I/O操做(synchronous I/O operation):致使请求进程阻塞,直到I/O操做完成。 异步I/O操做(asynchronous I/O operation): 不致使请求进程阻塞。 根据上述定义,咱们的前四种模型------阻塞式I/O模型,非阻塞式I/O模型、I/O多路 复用模型和信号驱动式I/O模型,由于其中真正的I/O操做将阻塞进程。只有异步I/O模型 与POSIX定义的异步I/O相匹配;
21,什么是管道,若是两个进程尝试从管道的同一端读写数据,会出现什么状况?
管道:是两个进程间进行单向通讯的机制。因为管道传递数据的单向性。 管道又称为半双工管道。 管道传递数据是单向性的,读数据时,写入管道应关闭。写数据时,读取管道应关闭。
22,为何要使用线程池/进程池?
对服务端开启的进程数或线程数加以控制,让机器在一个本身能够承受的 范围内运行,这就是进程池或线程池的用途.
23,若是多个线程都在等待同一个锁被释放,请问当该锁对象被释放的时候,哪个线程将会得到该锁对象?
这个由操做系统的调度决定。
24,import threading;s = threading.Semaphore(value=-1)会出现什么状况?
当threading.Semaphore(1) 为1时,表示只有一个线程可以拿到许可, 其余线程都处于阻塞状态,直到该线程释放为止。 固然信号量不可能永久的阻塞在那里。信号量也提供了超时处理机制。 若是传入了 -1,则表示无限期的等待。
25,请将二进制数10001001转化为十进制;
请将二进制数10001001转化为十进制; 经分析,二进制10001001转化为:1*2^7 + 1*2^3 + 1*2^0 = 137
26,某进程在运行过程当中须要等待从磁盘上读入数据,此时该进程的状态将发生什么变化?
一个程序有三种状态:运行态,阻塞态,就绪态; 遇到IO阻塞,进程从运行态转到阻塞态,cpu切走,保存当前状态;
27,请问selectors模块中DefaultSelector类的做用是什么;
IO多路复用:select poll epoll select: 列表循环,效率低。windows 支持。 poll: 可接收的列表数据多,效率也不高。linux 支持。 epoll: 效率最高 异步操做 + 回调函数。linux 支持。 selectors 模块: sel=selectors.DefaultSelector() 自动根据操做系统选择select/poll/epoll
28,简述异步I/O的原理;
用户进程发起read操做以后,马上就能够开始去作其它的事。 而另外一方面,从kernel的角度,当它受到一个asynchronous read以后, 首先它会马上返回,因此不会对用户进程产生任何block。 而后,kernel会等待数据准备完成,而后将数据拷贝到用户内存, 当这一切都完成以后,kernel会给用户进程发送一个signal,告诉它read操做完成了。
29,请问multiprocessing模块中的Value、Array类的做用是什么?举例说明它们的使用场景
python 多进程通讯Queue Pipe Value Array queue和pipe用来在进程间传递消息; Value + Array 是python中共享内存映射文件的方法;速度比较快.
30,请问multiprocessing模块中的Manager类的做用是什么?与Value和Array类相比,Manager的优缺点是什么
Python multiprocessing.Manager(进程间共享数据) Python中进程间共享数据,除了基本的queue,pipe和value+array外, 还提供了更高层次的封装。使用multiprocessing.Manager能够简单地使用这些高级接口。 Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition, Event,Queue,Value和Array。
31,请说说你对multiprocessing模块中的Queue().put(), Queue().put_nowait(), Queue().get(), Queue().get_nowait()的理解;
q = Queue(3) 队列 先进先出 进程间通讯; 队列 = 管道 + 锁 q.put() q.put_nowait() # 无阻塞,当队列满时,直接抛出异常queue.Full q.get() q.get_nowait() # 无阻塞,当队列为空时,直接抛出异常queue.Empty
32,什么是协程?使用协程与使用线程的区别是什么?
协程:单线程下的并发。协程是一种用户态的轻量级线程,即协程是由用户程序本身控制调度的。 1.python的线程是属于内核级别的,即由操做系统控制调度(如单线程 遇到io或执行时间过长就会被迫交出cpu执行权限,切换其余的线程运行) 2.单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操做系统) 控制切换,以此来提高效率(!!非io操做的切换与效率无关)
33,asyncio的实现原理是什么?
https://www.cnblogs.com/earendil/p/7411115.html Python异步编程:asyncio库和async/await语法 asyncio是Python 3.4 试验性引入的异步I/O框架,提供了基于协程作异 步I/O编写单线程并发代码的基础设施。 其核心组件有事件循环(Event Loop)、协程(Coroutine)、任务(Task)、 将来对象(Future)以及其余一些扩充和辅助性质的模块。 synchronous io: 作”IO operation”的时候会将process阻塞;”IO operation”是指真实的IO操做 blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO这一类. asynchronous io: 当进程发起IO 操做以后,就直接返回不再理睬了,直到kernel发送一个信号, 告诉进程说IO完成。在这整个过程当中,进程彻底没有被block。异步io的实现会负责把 数据从内核拷贝到用户空间
一、数据库介绍、类型、特性 二、MySQL数据库安装、链接、启动、中止 三、表字段类型介绍、主键约束、表建立语句 四、经常使用增删改查语句、分组、聚合 五、外键管理、unique字段、表结构修改语法 六、跨表查询,inner join、left join、right join、full join语法 七、复杂SQL语句如group by、子查询、函数的使用 八、索引原理及做用、普通索引、多列索引、惟一索引、全文索引等 九、基于hash&b+树索引的实现原理,索引的优缺点剖析 十、事务原理,ACID特性,应用场景讲解 十一、事务回滚 十二、触发器的特性,应用场景 1三、触发器的增删改查方法 1四、存储过程的做用及应用场景 1五、建立存储过程,参数传递,流程控制语句if\while\repeat\loop等,动态SQL的建立 1六、视图的做用及使用场景,视图的增删改查 1七、数据库权限管理,用户管理 1八、数据库备份命令及工具讲解 1九、基于不一样业务的数据库表结构设计、性能优化案例 20、pymysql模块介绍和使用
1,说说你所知道的MySQL数据库存储引擎,InnoDB存储引擎和MyISM存储引擎的区别?
主要有 MyISM:MyISAM存储引擎:不支持事务、也不支持外键, 优点是访问速度快,对事务完整性没有 要求或者以select,insert为主的 应用基本上能够用这个引擎来建立表 InnoDB:支持事务 Memory:Memory存储引擎使用存在于内存中的内容来建立表。每一个memory表 只实际对应一个磁盘文件,格式是.frm。memory类型的表访问很是的快,由于它 的数据是放在内存中的,而且默认使用HASH索引,可是一旦服务关闭,表中的数 据就会丢失掉。 Merge:Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构彻底 相同,merge表自己并无数据,对merge类型的表能够进行查询,更新,删除操做, 这些操做其实是对内部的MyISAM表进行的。 BLACKHOLE:黑洞存储引擎,能够应用于主备复制中的分发主库。 MyISM和InnoDB的区别 InnoDB支持事务,而MyISM不支持事务 InnoDB支持行级锁,而MyISM支持表级锁 InnoDB支持外键,而MyISM不支持 InnoDB支持全文索引,而MyISM不支持 InnoDB是索引组织表,MyISM是堆表 (堆表的数据是随机插入的,索引组织表的数据是有序的)
MyISAM:读事务要求不高,以查询和插入为主,可使用这个引擎来建立表, 例如各类统计表。 InnoDB:对事务要求高,保存的是重要的数据 例如交易数据,支付数据等,对用户重要的数据,建议使用InnoDB。
二、MySQL中char和varchar的区别,varchar(50)和char(50)分别表明什么意思?
char(50): 定长,字符的长度为50,浪费空间,存取速度快,数据不足时, 会往右填充空格来知足长度。 varchar(50): 变长,字符的长度为50,节省空间,存取速度慢,存储数据 的真实内容,不会填充空格,且会在真实数据前加1-2bytes,表示真实数据的bytes字节数。
三、MySQL中int类型存储多少个字节?
int存储4字节 有符号:(-2147483648,2147483647) 无符号:(0,4294967295)
4,主键具备什么特征?
不为空且惟一
五、简述你对inner join、left join、right join、full join的理解;
多表链接查询: inner join: 内链接,只链接匹配的行,找两张表共有的部分; left join: 外链接之左链接,优先显示左表所有记录,在内链接的基础上增长左表有右表没有的结果; right join: 外链接之右链接,优先显示右表所有记录,在内链接的基础上增长右表有左表没有的结果; full join: = left join on union right join on ... mysql 不支持full join 可是能够用 union ... 全外链接,显示左右两个表所有记录,在内链接的基础上增长左表有右表没有和右表有左表没有的结果;
六、concat, group_concat函数的做用是什么?
定义显示格式: concat() 用于链接字符串 eg: select concat('姓名:',name,'年薪:',salasy*12) as annual_salary from employee; concat_ws() 第一个参数为分隔符 eg: select concat_ws(':',name,salary*12) as annual_salary from employee; group by 与 group_concat() 函数一块儿使用 select post,group_concat(name) as emp_members from employee group by post;
七、请介绍事务的实现原理;
事务:用于将某些操做的多个sql做为原子性操做,一旦有某一个出现错误, 便可回滚到原来的状态,从而保证数据库数据的完整性。 原子性:一堆sql语句,要么同时执行成功,要么同时失败!
八、索引的本质是什么?索引有什么优势,缺点是什么?
索引在mysql中也称为键,本质是都是经过不断缩小想要获取的数据范围 来筛选最终想要的结果,同时把随机的事件变成有序的事件,也就是说, 有了索引机制,咱们能够老是用同一种查找方式来锁定数据
索引是帮助MySQL高效获取数据的数据结构。所以,索引的本质是一种数据结构。 在数据以外,数据库系统还能够维护知足特定查找算法的数据结构,这些数据结构 以某种方式指向真实数据,这样就能够在这些数据结构上实现高级查找算法,这种 数据结构就是索引。 优势: 一、提升数据检索效率,下降数据库的IO成本; 二、经过索引对数据进行排序,下降了数据排序的成本,下降了CPU的利用率; 缺点: 一、索引实际上也是一张表,索引会占用必定的存储空间; 二、更新数据表的数据时,须要同时维护索引表,所以,会下降insert、update、delete的速度;
九、哪些状况下须要建立索引,哪些状况下不须要建立索引?
一、主键自动建立惟一非空索引; 二、频繁做为查询条件的字段应该建立索引; 三、频繁更新的字段不适合简历索引,由于每次更新不只仅更新数据表同时还会更新索引表; 四、查询中常常排序的字段,能够考虑建立索引; 五、若是某个字段的重复数据较多,不适合建立普通索引;
十、请分别介绍ACID表明的意思,什么业务场景须要支持事务,什么业务场景不须要支持事务?
ACID,指数据库事务正确执行的四个基本要素的缩写。 包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 一个支持事务(Transaction)的数据库,必需要具备这四种特性,不然在事务过程(Transaction processing)当中没法保证数据的正确性。 使用场景: 银行的交易系统 eg: start transaction; update user set balance = 900 where name = 'wsb'; #买支付100元 update user set balance = 1010 where name = 'egon'; #中介拿走10元 uppdate user set balance = 1090 where name = 'ysb'; #卖家拿到90元,出现异常没有拿到 rollback; commit;
十一、什么是触发器,请简述触发器的使用场景?
使用触发器能够定制用户对表进行【增、删、改】操做时先后的行为,注意:没有查询。 触发器没法由用户直接调用,而知因为对表的【增/删/改】操做被动引起的。 eg: create trigger tri_before_insert_tb1 before insert on tb1 for each row begin ... end
十二、什么是存储过程,存储过程的做用是什么?
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中, 经过调用它的名字能够执行其内部的一堆sql。 优势: 1. 用于替代程序写的SQL语句,实现程序与sql解耦 2. 基于网络传输,传别名的数据量小,而直接传sql数据量大 缺点: 1. 程序员扩展功能不方便 eg: delimiter // create procedure p1() begin select * from blog; insert into blog(name,sub_time) values('xxx',now()); end // delimiter ;
1三、什么是视图,简单介绍视图的做用和使用场景?
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】, 用户使用时只需使用【名称】便可获取结果集,能够将该结果集当作表来使用。 视图取代复杂的sql语句,方便用来查询。 eg: create view teacher_view as select tid from teacher where tname='李平老师';
1四、如何查看SQL语句的执行计划?
http://blog.itpub.net/12679300/viewspace-1394985/ 执行计划的查看是进行数据库的sql语句调优时依据的一个重要依据. eg: explain select * from class; +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | class | ALL | NULL | NULL | NULL | NULL | 12 | NULL | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ Id:包含一组数字,表示查询中执行select子句或操做表的顺序; 执行顺序从大到小执行; 当id值同样的时候,执行顺序由上往下; Select_type:表示查询中每一个select子句的类型(简单OR复杂),有如下几种: SIMPLE:查询中不包含子查询或者UNION PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY SUBQUERY:在SELECT或WHERE列表中包含了子查询,该子查询被标记为SUBQUERY DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生) 若第二个SELECT出如今UNION以后,则被标记为UNION; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED 从UNION表获取结果的SELECT被标记为:UNION RESULT Type:表示MySQL在表中找到所需行的方式,又称“访问类型”,常见有如下几种: ALL:Full Table Scan, MySQL将进行全表扫描; index:Full Index Scan,index与ALL区别为index类型只遍历索引树; range:range Index Scan,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询; ref:非惟一性索引扫描,返回匹配摸个单独值的全部行。常见于使用非惟一索引或惟一索引的非惟一前缀进行的查找; eq_ref:惟一性索引扫描,对于每一个索引键,表中只有一条记录与之匹配。常见于主键或惟一索引扫描 const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量 NULL:MySQL在优化过程当中分解语句,执行时甚至不用访问表或索引 possible_keys:指出MySQL能使用哪一个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不必定被查询使用; key:显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。当查询中若使用了覆盖索引,则该索引仅出如今key列表中 key_len:表示索引中使用的字节数,可经过该列计算查询中使用的索引的长度 ref:表示上述表的链接匹配条件,即那些列或常量被用于查找索引列上的值; rows:表示MySQL根据表统计信息及索引选用状况,估算的找到所需的记录所须要读取的行数; Extra:包含不适合在其余列中显示但十分重要的额外信息; Using where:表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),若是查询未能使用索引,Using where的做用只是提醒咱们MySQL将用where子句来过滤结果集 Using temporary:表示MySQL须要使用临时表来存储结果集,常见于排序和分组查询; Using filesort:MySQL中没法利用索引完成的排序操做称为“文件排序”;
1五、在你本地数据库中查看select from student*的执行计划,并解释每一个字段分别表明什么意思?
mysql> explain select * from student; +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | student | ALL | NULL | NULL | NULL | NULL | 16 | NULL | +----+-------------+---------+------+---------------+------+---------+------+------+-------+ id: 表示查询中执行select子句或操做表的顺序。 select_type: simple 表示查询中不包含子查询或者union table: student type: all 表示mysql将进行全表扫描 possible_keys: 指出MySQL能使用哪一个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不必定被查询使用; key: 显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。当查询中若使用了覆盖索引,则该索引仅出如今key列表中; ey_len:表示索引中使用的字节数,可经过该列计算查询中使用的索引的长度; ref:表示上述表的链接匹配条件,即那些列或常量被用于查找索引列上的值; rows:表示MySQL根据表统计信息及索引选用状况,估算的找到所需的记录所须要读取的行数; Extra:包含不适合在其余列中显示但十分重要的额外信息;
1六、数据备份分为哪几种类型?增量备份和差别备份的区别是什么?
完整备份:备份系统中的全部数据。特色:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。 增量备份:只备份上次备份之后有变化的数据。 特色:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件, 因此备份体积小,备份速度快,可是恢复的时候,须要按备份时间顺序, 逐个备份版本进行恢复,恢复时间长。 差别备份:只备份上次彻底备份之后有变化的数据。 特色:占用空间比增量备份大,比完整备份小,恢复时仅须要恢复第一个完 整版本和最后一次的差别版本,恢复速度介于完整备份和增量备份之间。 简单的讲,完整备份就是无论三七二十一,每次都把指定的备份目录完整的复制一遍, 无论目录下的文件有没有变化; 增量备份就是每次将以前(第一次、第二次、直到前一次)作过备份以后有变化的文件进行备份; 差别备份就是每次都将第一次完整备份以来有变化的文件进行备份。
1七、请介绍select语句的执行顺序;
from where group by having select distinct order by limit 说明: 1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一条条记录进行分组group by,若是没有group by,则总体做为一组 4.将分组的结果进行having过滤 5.执行select 6.去重 7.将结果按条件排序:order by 8.限制结果的显示条数
1八、请问存储引擎MyISM和InnoDB的适合什么样的使用场景?
Innodb与Myisam引擎的区别与应用场景: 1. 区别: (1)事务处理: MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理); (2)锁机制不一样: MyISAM是表级锁,而InnoDB是行级锁; (3)select ,update ,insert ,delete 操做: MyISAM:若是执行大量的SELECT,MyISAM是更好的选择 InnoDB:若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表 (4)查询表的行数不一样: MyISAM:select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含 where条件时,两种表的操做是同样的 InnoDB : InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行 (5)外键支持: mysiam表不支持外键,而InnoDB支持 2. 为何MyISAM会比Innodb 的查询速度快。 INNODB在作SELECT的时候,要维护的东西比MYISAM引擎多不少; 1)数据块,INNODB要缓存,MYISAM只缓存索引块, 这中间还有换进换出的减小; 2)innodb寻址要映射到块,再到行,MYISAM 记录的直接是文件的OFFSET,定位比INNODB要快 3)INNODB还须要维护MVCC一致;虽然你的场景没有,但他仍是须要去检查和维护 MVCC ( Multi-Version Concurrency Control )多版本并发控制 3. 应用场景 MyISAM适合:(1)作不少count 的计算;(2)插入不频繁,查询很是频繁;(3)没有事务。 InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都至关的频繁,而且行锁定的机会比较大的状况。
1九、请举出MySQL中经常使用的几种数据类型;
mysql经常使用数据类型: 1.数值类型: 整数类型:tinyint smallint int bigint 浮点型:float double decimal float :在位数比较短的状况下不精准(通常float得精确度也够用了) double :在位数比较长的状况下不精准 0.000001230123123123 存成:0.000001230000 decimal:(若是用小数,则推荐使用decimal) 精准 内部原理是以字符串形式去存 2.日期类型: 最经常使用:datetime year date time datetime timestamp 3.字符串类型: char(6) varchar(6) char(10):简单粗暴,浪费空间,存取速度快,定长; root存成root000000 varchar:精准,节省空间,存取速度慢,变长; sql优化:建立表时,定长的类型往前放,变长的日后放 好比性别 好比地址或描述信息 >255个字符,超了就把文件路径存放到数据库中。 好比图片,视频等找一个文件服务器,数据库中只存路径或url。 4.枚举类型与集合类型: enum('male','female') set('play','music','read','study')
20、什么状况下会产生笛卡尔乘积,如何避免?
交叉链接:不适用任何匹配条件。生成笛卡尔积; select * from employee,department; 避免: select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id=department.id;
2一、请列举MySQL中经常使用的函数;
聚合函数: 聚合函数聚合的是组的内容,如果没有分组,则默认一组 count() max() min() avg() sum()
2二、请说明group by的使用场景;
什么是分组,为何要分组? 一、首先明确一点:分组发生在where以后,即分组是基于where以后获得的记录而进行的 二、分组指的是:将全部记录按照某个相同字段进行归类,好比针对员工信息表的职位分组, 或者按照性别进行分组等 三、为什么要分组呢? 取每一个部门的最高工资 取每一个部门的员工数 取男人数和女人数 小窍门:‘每’这个字后面的字段,就是咱们分组的依据 四、大前提: 能够按照任意字段分组,可是分组完毕后,好比group by post,只能查看post字段, 若是想查看组内信息,须要借助于聚合函数
2三、请介绍hash索引和B+树索引的实现原理;
哈希索引基于哈希表实现,只有精确匹配索引的全部列的查询才有效。 对于每一行数据,存储引擎都会对全部的索引列计算一个哈希码,哈希码 是一个较小的值,而且不一样键值的行计算出来的哈希码也不同。哈希索 引将全部的哈希码存储在索引中,同时在哈希表中保存指向每一个数据行的 指针。也就是说,因为哈希查找比起B-Tree索引,其自己对于单行查询的 时间复杂度更低,有了哈希索引后明显可加快单行查询速度。 可是哈希索引也有它本身的限制: 哈希索引只包含哈希值和行指针,而不存储字段值,因此不能使用索引中 的值来避免读取行。不过,访问内存中的行的速度很快,因此大部分状况下 这一点对性能的影响并不明显。 哈希索引数据并非按照索引值顺序存储的,因此也就没法用于排序。 哈希索引也不支持部分索引列匹配查找,由于哈希索引始终是使用索引列的 所有内容来计算哈希值的。例如,在数据列(A, B)上创建哈希索引,若是查 询只有数据列A,则没法使用该索引。 哈希索引只支持等值比较查询,包括=、in()、<=>。不支持任何范围查询, 例如where price > 100。 访问哈希索引的数据很是快,除非有不少哈希冲突。若是哈希冲突不少的话, 一些索引维护操做的代价也很高。 B+树索引是B树索引的变体,本质上也是多路平衡查找树