还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
对于项目
1.明确你的项目到底是做什么的,有哪些功能
2.明确你的项目的整体架构,在面试的时候能够清楚地画给面试官看并且清楚地指出从哪里调用到哪里、使用什么方式调用
3.明确你的模块在整个项目中所处的位置及作用
4.明确你的模块用到了哪些技术,更好一些的可以再了解一下整个项目用到了哪些技术操作系统操作系统的四大特性并发性共享性虚拟性不确定性请叙述一下并发和并行两个概念的区别?并行是指两个或多个事件在同一时刻发生,并发是指两个或多个事件在同一时间间隔内发生什么是进程?什么是线程?“进程是一个可并发执行的,具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和调度的独立单位”进程是资源分配的基本单位线程也称为轻量级进程LWP,是程序执行流量的最小单位,它是进程的一个实体,是系统独立调度和分派处理机的基本单位线程是操作系统调度的最小单位进程和线程的区别?从调度、并发性、拥有资源和系统开销四个方面来比较调度在引入线程的操作系统中,把线程作为调度和分派CPU的基本单位,把进程作为资源分配的基本单位,显著提高了并发程度由于系统调度的基本单位是线程,所以每个进程至少创建一个线程,否则无法被调度并发性多线程可以提高服务的质量,在一个线程阻塞时,还有其他线程提供服务拥有资源进程是拥有资源的独立单位,线程自己不拥有系统资源,而是共享进程的资源包括代码段、数据段即系统资源等系统开销进程切换的开销远远大于线程切换的开销,进程的切换需要保存很多现场,但线程只需要保存和设置少量的寄存器内容,不涉及存储器管理方面的操作进程的特征动态性进程是动态产生和动态消亡的,有其生存周期并发性一个进程可以与其他进程一起向前推进独立性一个进程是一个相对完整的调度单位异步性每个进程都已相对独立、不可预知的速度向前推进结构性为了控制和管理进程,系统为每个进程设立一个进程控制块PCB进程有几种状态?就绪状态运行状态单CPU环境下,系统处于运行状态的进程最多只有一个阻塞状态进程的组成程序数据集合进程独有进程控制块PCB它和进程一一对应,PCB是操作系统能感知进程存在的唯一标识,操作系统正是通过管理PCB来管理进程的系统创建进程时,为每个进程分配PCB,进程执行完成后,系统释放PCB,进程也随之消亡进程的切换进程上下文包含用户级上下文、系统级上下文、寄存器上下文进程上下文切换是核心态的切换,不发生在用户态用户态到核心态之间的转变是CPU模式的改变模式切换不同于进程切换,并不引起进程状态的改变为什么会提出线程这个概念?进程的缺点是什么?进程切换开销大进程通信代价大进程之间并发性粒度粗,并发度不高不适合并行计算和分布式并行计算的要求不适合客户-服务器计算的要求操作系统中引入进程的目的是为了使多个程序并发执行,改善资源的利用率以提高系统的吞吐量线程的分类用户级线程–ULT,优点是线程切换不需要系统状态的转换,每个进程可以使用专门的调度算法来调度线程,不需要依赖操作系统底层的内核缺点是父进程阻塞会导致线程全都阻塞,不能真正的并行Java的线程就是一种用户级的线程内核级线程–KLT,优点是同一个进程内多个线程可以并行执行,缺点是线程状态转换时内核态的任务,通常很慢混合式线程–上两种的结合,有良好的效果进程控制块的作用?它是如何描述进程动态性质的?PCB是系统感知进程存在的唯一标志,是进程动态特性的集中反映,和进程一一对应,操作系统通过管理PCB来管理进程进程控制块包含进程描述信息,控制信息,和资源管理信息三类这些信息的变化反映进程的动态性质操作系统内核都包括哪些内容?一是支撑功能,包括中断处理,时钟管理和原语操作等,二是资源管理功能,包括进程管理,存储器管理和设备管理等处理机调度的三个分类?高级调度–作业调度中级调度–交换调度内存和硬盘之间的交换低级调度–进程调度操作系统的核心高级调度发生在创建新进程时,它决定一个进程能否被创建,或者是创建后能否被设置成就绪状态,以参与竞争处理器资源;中级调度反映到进程状态上就是挂起和解除挂起,它根据系统的当前符合情况决定停留在主存中的进程数;低级调度则是决定哪一个就绪进程或线程占有CPU运行批作业调度算法先来先服务最短作业优先响应比高者优先优先级算法进程调度的方式非剥夺方式非抢占式方式优点是简单、易实现,系统开销小缺点是不太灵活,难以满足紧迫任务必须立即执行的要求实时系统不宜采用这种调度方式可剥夺方式抢占式方式优先权更高的进程优先执行进程调度的算法先来先服务算法最短优先算法优先级算法优先级高的先执行可以采用剥夺或非剥夺,剥夺方式更能反映优先的特点,但是会造成无穷阻塞和饥饿现象轮转算法基本思想是系统把所有就绪进程按先来先服务的原则排成一个队列,且规定一个较小的时间单元,称为时间量或时间片,按时间片把CPU轮流分配给进入就绪队列的第一个进程使用,当进程的时间片使用完后,产生一个时钟中断,剥夺该进程的执行,将它送到就绪队列的队尾,等待下次调度轮转算法专门为分时系统设计多级队列调度算法根据不同的进程,分配到不同的队列中,实行不同的调度算法一般按照优先级分成多个队列,高优先级的任务先做多级反馈队列调度算法按优先级分配队列,但是优先级越高分配的时间片越小,如果没做完,自动移动到下一级队列继续做实时调度算法操作系统多任务的抢占机制是怎么实现的?哪种权限许可用户进入一个文件系统的目录?Read,Execute,Write,AccessControllLinux32位系统,应用程序最多能分配的内存大小?sleep和wait的区别?Win32下线程的基本模式?进程之间的关系?竞争关系由于进程之间不知道彼此的存在,而使用了同一份资源,就会造成竞争资源竞争会出现饥饿和死锁协作关系什么是临界资源?什么是临界区?临界资源把一次只允许一个进程使用的资源成为临界资源独占性,如打印机,卡片输出机等临界区把每个进程中访问临界资源的那段代码从概念上分离出来,将其称为临界区即临界区是指对临界资源实时操作的程序的代码段相关临界区并发进程中涉及相同临界资源的临界区相关临界区必须互斥执行什么是进程互斥?进程互斥是解决进程间竞争关系间接制约关系的手段指任何时刻不允许两个以上的共享该资源的并发进程同时进入临界区,这种现象称为互斥相关临界区的管理原则互斥、空闲让进、有限等待进程同步的概念?进程同步指两个或多个进程为了合作完成同一个任务,在执行速度或某些确定的时序点上必须相互协调,即一个进程的执行依赖于另一个进程的消息,当一个进程到达了某一个确定点而没有得到合作伙伴发来的已完成消息时必须等待,知道该消息到达被唤醒后,才能继续向前推进进程同步和互斥的关系?进程的互斥实际上是进程同步的一种特殊情况,即主次使用互斥共享资源,也是对进程使用资源次序上的一种协调进程的互斥和同步统称为进程同步进程的互斥是进程间共享资源的使用权,这种竞争没有固定的必然联系,哪个进程竞争到资源的使用权,该资源就归哪个进程使用,直到它不再需要使用时才归还资源;而进程同步中,所涉及的共享资源的并发进程间有一种必然的联系,当进程必须同步时,即使无进程在使用共享资源,尚未得到同步消息的进程也不能去使用该资源信号量机制PV操作信号量机制的实现原理是两个或多个进程可以利用彼此间收发的简单信号来实现正确的并发执行,一个进程在收到一个指令信号前,会被迫在一个确定的或者需要的地方停下来,从而保持同步或互斥用信号量机制解决进程的同步和互斥问题有如下三个步骤分析进程之间的制约关系设置信号量实施P、V操作同步的实现机制临界区通过多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问互斥量采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问信号量允许多个线程同时访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统PV操作相似事件信号通过通知操作的方式保持多线程同步,还可以方便的实现多线程的优先级比较的操作经典的同步问题生产者消费者问题读者-写者问题(读者优先信号量+读进程计数器rc;弱写者优先信号量+读进程计数器rc+排队信号量read;强写者优先信号量+读进程计数器rc+排队信号量read+写优先信号量write_first)哲学家就餐问题是在多个线程之间共享多个资源时会不会导致死锁或饥饿的典型模型解决方案每个哲学家取得手边的两个叉子才能吃面,即仅当一个哲学家左右两边的叉子都可用时,才允许他拿叉子,否则一个叉子也不取偶数号哲学家先取手边的叉子,奇数号哲学家先取右手边的叉子嗜睡理发师问题进程通信的方式共享存储消息缓冲消息传递信箱管道通信产生死锁的原因?进程竞争资源引起的死锁进程推进顺序不当产生死锁产生死锁的条件互斥条件同时只能有一个进程持有资源请求和保持条件一个进程请求资源得不到满足时,不释放占有的资源不剥夺条件任何一个进程不能抢夺其他进程占有的资源循环等待条件存在一个循环等待链,链中每个进程已获得资源,并分别等待前一个进程持有的资源处理死锁的方法死锁预防破坏产生死锁条件的任何一个或多个,如静态资源分配策略2和按序分配资源策略4死锁避免采用银行家算法,每次分配都查看能否找到一种资源分配方法,使得已有的进程可以顺利完成任务,如果有,则分配,否则不分配死锁检测和解除用软件来检查有进程和资源构成的有向图是否存在一个或多个回路分页存储管理、段式存储管理和段页式存储管理的基本思想分页利用分页存储管理,允许把一个作业存放到若干个不相邻的内存区域中,减少大碎片分段段式存储管理支持用户的分段观点,以段为单位进行存储空间的分配分段存储管理的引入,主要为了方便编程、信息共享和信息保护有利于程序的运行段页式段页式存储管理的基本原理是先将整个主存划分成大小相等的存储块页框,把用户程序分段,接着为每一段进行分页分页和分段的区别?分页是信息的物理单位,与源程序的逻辑结构无关,用户不可见,分页的目的主要是为了减少碎片,提高主存的利用率分段是信息的逻辑单位,由源程序的逻辑结构来决定,目的是更好地满足用户的需求页的大小固定且由系统确定,而段的长度不固定,由用户程序决定分页的作业地址空间是一维的线性地址空间,分段的作业地址空间是二维的段名和段内地址缓存的局部性原理根据研究,在较短的时间内,程序的执行会局限于某一个部分,则可以根据当前程序运行的位置,推测可能执行的程序,预先加载,来达到缓存的目的虚拟内存的实现RAID技术RAID1两个磁盘互相备份,安全性最好,但磁盘利用率50%,最低RAID2采用汉明码做出错校验,按位交叉存取,用于大数据的读写,但冗余信息开销大,已被淘汰RAID3位交织奇偶校验,使用一个磁盘做奇偶校验,数据分段存储在其余磁盘中,一旦有损坏,可以利用奇偶校验来重建数据,但校验盘损坏则没救,磁盘利用率n-1RAID4块交织奇偶校验,按块存取,可以单独对某个盘进行操作,一次操作只涉及数据盘和校验盘,不适合随机分散的小数据RAID5块交织分布式奇偶校验,同样以数据校验位来保证数据的安全,不同于校验盘,它将数据段的校验位交互存放于各个硬盘,则任何一个硬盘损坏,都可以根据其他硬盘上的校验位来重建损坏的数据,磁盘利用率n-
1.SPOOLing系统?在内存和硬盘中间建立缓冲区,在内存写入硬盘的过程中,先写入缓冲,等到CPU空闲时,才从缓冲区写入硬盘同步和异步有什么不同?各自的优势?什么是线程?线程的基本状态?synchronized和Lock的异同?什么是序列化?什么是持久化?什么是串行化?transient的用法?哪些字段需要标记transient?synchronized关键字的用法?什么是守护线程?举一个守护线程的例子?计算机网络OSI模型及其各层次的作用?TCP/IP模型各层次及协议?数据链路层和MAC层介质访问控制层?计算机网络协议、接口和服务的概念?数据链路层流量控制、可靠传输和滑动窗口机制数据链路层设备网桥和局域网交换机网络层的功能异构网络互联、路由与转发、拥塞控制路由算法距离-向量路由算法、链路状态路由算法、层次路由IPv4内容分组、NAT、子网划分和子网掩码ARP协议、DHCP协议与ICMP协议网络层设备路由器的组成和功能,路由表和路由转发流量控制和拥塞控制的区别?传输层的功能?传输层的寻址与端口?套接字?TCP协议和UDP协议?Java实现?UDP首部?TCP段、TCP连接管理、TCP可靠传输、TCP流量控制和拥塞控制TCP的拥塞控制慢开始、拥塞避免、快重传、快恢复应用层:P2P模型?应用层协议DNS、FTP、EMAIL、MIME、STMP、POP
3、HTTPCGI?域名解析过程?MySQL数据库INSERT嵌套SELECTMySQL数据类型,int类型长度超出了也不会对数据产生影响,和SQLMODE有关一个表中最多只能有一个自增长列DDL、DML、DCL、DQL语句?DDL(数据定义语言)create、drop、alterDML(数据操纵语言)insert、delete、update、selectDCL(数据控制语言)grant、revokeMySQL的其他数据库information_schema数据库存储了数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等cluster存储了系统的集群信息mysql存储了系统的用户权限信息test是系统自动创建的测试数据库,任何用户都可以使用内连接查询即为多表查询,仅选出两张表中互相匹配的记录,外连接则会选出其他不匹配的记录子查询经常使用in、notin、=、!=、exists、notexists等表连接很多情况下用于优化子查询合并记录用union含distinct或unionallMySQL数字类型及字节数、日期类型及字节数、字符串类型及字节数MySQL可以使用REGEXP或RLIKE来使用正则匹配NULL不能用于=等,但可以使用=比较NULL比较时不区分大小写,数字作为浮点数比较短路与和非NULL结果都为NULL,只有1或NULL为1MySQL常用函数字符串CONCAT、INSERT、LEFT、RIGHT、REPLACE、SUBSTRING、LPAD、RPAD、TRIM、REPEAT等数值函数ABS、CEIL、FLOOR、MOD、RAND、ROUND、TRUNCATE等x%y任意为NULL结果都为NULL产生0~100随机数为selectceil100*randceil100*rand日期和时间函数CURDATE、CURTIME、NOW、UNIX_TIMESTAMP、FROM_UNIXTIME、DATE_FORMAT、DATEDIFF、DATE_ADD等,格式为%Y-%m-%d%H-%i-%s流程函数IF、IFNULL、CASEWHENTHENELSEEND、CASEexpWHENTHENELSEEND其他函数DATABASE、VERSION、USER、INET_ATON、INET_NTOA、PASSWORD、MD5MySQL存储类型MyISAM、InnoDB、BDB、MEMORY、CSV等,只有InnoDB和BDB支持事务,其他都不支持MySQL默认存储引擎为InnoDBInnoDB和MyISAM的区别?事务、外键、访问速度、占用空间、存储方式MyISAM静态表、动态表和压缩表InnoDB共享表空间、多表空间等方面MEMORY表使用HASH索引,数据量大小由max_heap_table_size变量来决定,默认16MB如何选择合适的存储引擎?以读操作和插入操作为主,少量更新和删除,对事务完整性、并发性要求不高则使用MyISAM引擎InnoDB则适合于并发要求高的场合,事务完整性要求较高,除了可以有效降低删除和更新导致的锁定,还可以确保事务的完整提交和回滚,适合财务管理系统MEMORY通常用于更新不太频繁的小表,可以快速得到结果MERGE组合了MyISAM表,突破了单个MyISAM表的限制,并可以分布在多个磁盘上,有效改善MERGE表的访问效率选择合适的数据类型?CHAR和VARCHAR-MyISAM建议固定长度的数据列CHARInnoDB建议使用VARCHAR类型TEXT和BLOB-尽量选择满足需求的最小的存储类型、大量删除后为提高性能应定期使用OPTIMIZETABLE功能进行标的碎片整理同时可以使用合成的索引Synthetic来提高大文本字段的查询性能,此种索引主要利用散列值,只能用于精确匹配的查询=不必要时尽量避免检索BLOB和TEXT单独将BLOB和TEXT分成一张表定点DECIMAL和浮点FLOAT\DOUBLE-定点更精确,字符串存储,而浮点数不精确,而且比较容易出错日期类型选择尽量选择满足需求的最小存储的日期类型,需要记录年份久远,则DATETIME如果需要不同时区使用,则使用TIMESTAMP选择合适的字符集满足应用支持语言的需求、考虑和已有数据的兼容性、汉字居多可以考虑GBK2字节,而UTF83字节,而英文则应该UTF81字节,其他2字节如果需要比较,排序等字符运算,则最好选择定长字符集尽量避免字符集转换字符集用来MySQL存储字符串的方式,校对规则用来定义比较字符串的方式查看方式showcharacterset;showcollationlike%%;校对规则_ci大小写不敏感、_cs大小写敏感、_bin基于编码值的比较MyISAM和InnoDB默认都是BTREE索引,目前不支持函数索引,但支持前缀索引此外,还支持全文索引默认情况下MEMORY使用HASH索引,也支持BTREE索引索引操作创建索引-CREATE[unique|fulltext|special]INDEXindex_name[USINGindex_type]ONtbl_nameindex_col_name....修改增加索引-ALTERTABLEtable_nameADD [unique|fulltext|special]INDEXindex_name[USINGindex_type]index_col_nameindex_col_name=col_name[length][ASC|DESC]可以通过explainselect语句查看是否使用了索引key:xxx为使用索引删除索引-DROPINDEXindex_nameONtbl_nameMyISAM索引前缀长度1000字节,InnoDB前缀索引长度最长767字节设计索引的原则索引列应选择SELECTWHERE语句后的列和表连接ON子句后的列尽量使用唯一索引,分布越分散效果越好,如性别就不适合索引,分布太密集尽量使用短索引,查询更快,IO更少利用最左前缀不要过度索引,会降低使用效率InnoDB会根据主键、唯一索引或内部列的排序来存储,所以尽量自己指定主键,选择常用列作为主键另外,InnoDB表的普通索引都会保存主键的键值,所以主键要尽可能选择较短的数据类型,可以有效减少索引的磁盘占用,提高索引缓存效果HASH索引只能使用在=或=等式比较时优化器不能使用HASH索引来加速ORDERBY操作BTREE索引可以用在,,=,=,BETWEEN,!=,,LIKEpatternpattern不能以通配符开头简而言之,范围查询适用于BTREE,不适用HASH索引MySQL使用索引,在检索的时候不需要查找所有数据,能快速定位需要的数据大多数索引存储在BTREE中,只有空间列类型的索引使用RTREE,MEMORY表支持HASH索引为什么需要使用视图?使用视图的用户不需要考虑对应表结构,关联条件和筛选条件使用视图可以控制用户访问到行列级别视图结构确定了,可以屏蔽表结构变化对用户的影响视图操作创建视图-CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[{column_list}]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]修改视图-ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[column_list]ASselect_statement [WITH[CASCADED|LOCAL]CHECKOPTION]删除视图-DROPVIEW[IFEXISTS]view_name[view_name][RESTRICT|CASCADE]查看视图-SHOWTABLES查看视图信息 -SHOWTABLESTATUS[FROMdb_name][LIKEpattern]查询视图定义-SHOWCREATEVIEWview_nameMySQL不允许在创建视图时使用子查询,可以使用查询视图语句来实现一些视图不可更新包含聚合函数SUM、MIN、MAX、COUNT等、DISTINCT、GROUPBY、HAVING、UNION或者UNIONALL常量视图SELECT包含子查询JOINFROM了一个不能更新的视图WHERE子句的子查询引用了FROM子句的表WITHCASCADED|LOCALCHECKOPTION决定了是否允许更新数据使记录不再满足视图的条件,LOCAL表示只要满足本视图的条件就可以更新,CASCADED必须满足所有针对该视图的所有视图条件才可以更新什么是存储过程?它有什么好处?它和函数有什么区别?存储过程操作创建存储过程-CREATEPROCEDUREsp_name[proc_parameter][characteristic]routine_body创建函数-CREATEFUNCTIONsp_name[func_parameter]RETURNStype[characteristic]routine_bodyproc_parameter=[IN|OUT|INOUT]param_nametypefunc_parameter=proc_parametertype=MySQL任意数据类型characteristic=LANGUAGE_SQL|[NOT]DETERMINISTIC|{CONTAINS_SQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}|COMMENTstringroutine_body=合法SQL语句修改函数或存储过程-ALTER{PROCEDURE|FUNCTION}sp_name[characteristic...]characteristic= {CONTAINS_SQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}|COMMENTstring调用存储过程-CALLsp_name[parameter]删除存储过程或函数-DROP{PROCEDURE|FUNCTION}[IFEXISTS]sp_name首先调用DELEMITER$$将结束符从;改成$$,使得过程和函数中的;不会被解释成语句结束而提示错误然后从DELEMITER;将结束符改回来存储过程变量的使用DECLEARlast_month_startDATE;变量赋值SETvar_name=expr;SELECTcol_nameINTOvar_nameFROMtbl_name....存储过程可以使用流程控制语句IFTHENELSEIFTHENELSEENDIF...也可以使用CASEWHENTHENWHENTHENELSEENDCASE循环使用LOOP语句begin_label:LOOPstatement_listENDLOOPend_labelLEAVE语句可以使用LEAVE跳出循环LEAVEbegin_label或BEGINENDITERATE语句同CONTINUEITERATEbegin_labelREPEAT语句begin_label:REPEATstatement_listUNTILsearch_conditionENDREPEATbegin_label.WHILE语句begin_label:WHILEsearch_conditionDOstatement_listENDWHILEend_label;事件调度器类似于时间触发器,定时执行任务创建语法CREATEEVENTmyeventONSCHEDULEATCURRENT_TIMESTAMP+INTERVAL1HOUR DO UPDATEmyschema.mytableSETmycol=mycol+1;事件调度器默认关闭禁用或删除事件调度器ALTERTABLEevent_nameDISABLE;DROPEVENTevent_name;事件调度器的优势避免数据库相关的定时任务部署在操作系统层,减少操作系统管理员产生误操作的风险,并方便迁移,迁移过程包括该数据库适用于定期收集统计信息、定期清理历史数据、定期数据检查复杂的处理适合程序实现触发器是与表有关的数据库对象,会在满足一定条件定义时触发,并执行触发器定义的语句集合创建触发器-CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtbl_nameFOREACHROWtrigger_stmt 同一张表相同时间相同事件的触发器,只可以定义一个触发器时间可分为BEFORE和AFTER,事件可分为INSERTUPDATEDELETE等可以使用INSERTINTO....ONDEPLICATEKEYUPDATEXXX来测试触发器执行顺序,如果已存在,则先insert在updateafterupdate如果不存在,则insertafterinsert删除触发器-DROPtriggerins_film;查看触发器-showtriggers;information_schema.triggers表什么时候使用触发器?不可以直接调用直接返回客户端数据的存储过程也不能使用开始或结束事务的语句starttransactioncommitrollback语句不要将过多的逻辑写在触发器中,影响CURD效率MySQL支持MyISAM和MEMORY锁表,对BDB进行锁页,对InnoDB锁行默认自动锁表和锁行,但有些时候用户会明确锁表或者进行事务的控制,以确保事务的完整性,这样就需要使用事务控制和锁定语句来完成LOCKTABLES可以锁定用于当前线程的表,UNLOCKTABLES会释放当前线程获得的任何锁定锁定语句-LOCKTABLEStbl_name[ASalias]{READ[LOCAL]|[LOW_PROORITY]WRITE} ...释放语句-UNLOCKTABLESMySQL的事务控制SETAUTOCOMMIT-设置是否自动提交,0表示不自动提交STARTTRANSACTION/BEGIN-开始一项新事务COMMIT-提交事务ROLLBACK-回滚事务如果锁表期间如果执行starttransaction命令,会有隐含unlocktable执行lock方式锁表,不能使用rollback进行回滚所有的DDL语句不能回滚,并且部分DDL语句会造成隐式提交可以定义savepointname来实现不同阶段的回滚,rollbacktosavepointnameMySQL的分布式事务只支持InnoDB引擎分布式事务还有问题如果分布式事务prepare时数据库重新启动,重启以后还可以进行提交或回滚,但此时不会写binlog,会造成主从数据库不一致如果客户端连接异常终止,那么数据库会回滚还未完成的分支事务,如果此时分支事务已经执行了prepare状态,其他分支可能已经成功提交,那么事务会不完整处于prepare状态的事务不记录binlog,如果数据库服务宕机,则会丢失数据防止SQL注入的几种措施使用PrepareStatement绑定变量,将输入的单引号转义输入,避免了SQL注入使用应用程序提供的转换函数自定义函数进行校验正则MySQLSQLMode REAL_AS_FLOAT、PPES_AS_CONCAT、ANSI_QUOTES、GNORE_SPACE、ANSISTRICT_TRANS_TABLES严格模式严格模式不允许插入超过定义长度的数据SQLMode常见功能校验日期数据的合法性,ANSI模式对非法日期会警告,而TRADITIONAL模式则直接提示日期非法,拒绝插入MODX0时,TRADITIONAL模式会抛出警告NO_BACKSLASH_ESCAPES会将\变成普通字符提供PIPES_AS_CONCAT,使得||可以连接字符串常用SQLMode ANSI-更符合标准SQLSTRICT_TRANS_TABLES-严格模式,可以用在事务表和非事务表,不允许非法日期,不允许超出长度,不正确的值会报错TRADITIONAL-严格模式,可以应用在事务表和事务表,出现错误立刻回滚MySQL分区根据一定的规则,数据库把一个表分解成多个更小的更容易管理的部分逻辑上一个表或者一个索引,实际上会有多个分区,每个分区都是独立的对象,可以独立处理,也可以作为表的一部分处理MySQL分区的优点和单个磁盘或者文件系统分区相比,可以存储更多的数据优化查询,where查询可能只需要查询几个分区,聚合函数时容易并行处理对于不需要的数据可以删除有关分区来达到快速删除的目的分散数据查询,以获得更大的查询吞吐量创建分区表CREATETABLEXXXENGINE=INNODBPARTITIONBYHASHMONTHbirth_datePARTITIONS6;MySQL的分区类型RANGE类型一定范围、List类型枚举出值来分区、Hash类型根据分区个数分配、key类型与Hash类似Hash分区键必须是INT类型,而其他三种类型分区可以使用其他类型不算BLOB和TEXT的列来作为分区键MySQL创建分区键,要么表中没有主键和唯一键,否则分区键必须为主键或唯一键RANGE分区PARTITIONBYRANGEkey PARTITIONp0VALUESLESSTHAN10 PARTITIONp1VALUESLESSTHAN20 PARTITIONp2VALUESLESSTHAN30适合场景方便删除经常使用分区键查询LIST分区PARTITIONBYLISTkey PARTITIONp0VALUESIN35 PARTITIONp1VALUESIN110 PARTITIONp2VALUESIN49更灵活插入不在分区内的数据会插不进,报错Columns分区PARTITIONBYRANGECOLUMNSab PARTITIONp01VALUESLESSTHAN010 PARTITIONp02VALUESLESSTHAN1010 PARTITIONp02VALUESLESSTHAN10MAXVALUE PARTITIONp02VALUESLESSTHANMAXVALUEMAXVALUE可以支持整数、日期时间和字符串三大数据类型,支持多列分区Hash分区PARTITIONBY[LINEAR]HASHstore_idPARTITION4;支持两种分区常规HASH分区和线性HASH分区,常规HASH使用取模算法,线性HASH使用2的幂运算比如上述分区,MOD234,4=2所以分到第二个分区中常规HASH分区的缺点增加分区后,HASH值可能需要重新计算,分区管理很复杂线性HASH分区当线性HASH分区个数是2的N次幂时,线性HASH的分区结果和常规HASH分区结果一致优点是在分区维护时处理的迅速,缺点是线性分区数据分布不太平衡KEY分区不允许使用自定义表达式,需要MySQL服务器提供的HASH函数,它可以支持非整数分区创建分区表时可不指定分区键,默认主键,没有会选择唯一键也可以创建常规和线性的分区可以对已经分区的表在建立子分区SUBPARTITIONS分区表的NULL值处理RANGE中为最小值,LIST必须出现在枚举列表中,否则不接受HASH/KEY中NULL为零值RANGELIST分区管理删除分区altertabletbl_namedroppartitionp2;增加分区altertabletb_nameaddpartitionpartitionp5valueslessthanxxx拆分分区altertabletbl_namereorganizepartitionp3intoxxx;HASHKEY分区管理合并删除分区ALTERTABLEtbl_nameCOALESCEPARTITIONp_name;减少分区数量先删除再重新定义COALESCE不能用作增加增加分区ALTERTABLEtb_nameADDPARTITIONpartitions8;不是增加到8,而是增加8个SQL优化的步骤通过show[session|global]status命令了解各种SQL的执行频率,可以了解当前应用是插入更新为主还是查询操作为主对于事务型应用,可以通过回滚操作的次数来判断应用编写是否存在问题定位执行效率较低的SQL语句通过慢查询日志来定位可以使用showprocesslist来查看当前MySQL正在执行的线程,包括线程状态,是否锁表等,可以实时查看SQL的执行情况通过Explain分析低效SQL的执行计划在SQL之前加入Explain子句,可以打出SQL的执行计划,通过查看计划,可以知道当前的SQL是否使用了索引等常见访问类型从左到右,性能最差到最好ALL全表扫描index索引全扫描range索引范围扫描ref使用非唯一索引扫描或唯一索引前缀扫描,返回一行eq_ref使用唯一索引,返回一行constsystem单表中最多有一个匹配行NULL不需要访问表或索引,直接得到结果通过explainextended命令加上SQL执行后的showwarnings可以看到SQL真正被执行之前,优化器做了哪些SQL改写如果使用explain不能很快定位SQL问题,可以选择profile联合分析Select@@have_profiling可以查看数据库是否支持profile,默认关闭,可以setprofiling=1开启profile通过执行showprofiles可以查看当前运行的Query,接着showprofileforqueryquery_ID可以看到执行过程中线程的每个状态和消耗的时间仔细检查showprofileforquery输出,可以发现时间都消耗在sendingdata状态中为了清晰看到排序结果,可以查询information_schema.profiling表,按DESC排序还可以showprofilecpu、all、blockio、contextswitch、pagefaultsforquery4;来查看各个部分占用的时间这里对比了MyISAM和InnoDB,发现InnoDB多了Sendingdata这个步骤,速度比MyISAM慢很多MySQL
5.6提供了trace文件,可以分析优化器如何选择执行计划首先打开trace,设置格式JSON,设置trace最大使用内存大小执行SQL语句检查Information_schema.optimizer_trace可以找到执行计划的日志MySQL的索引专题索引的几种实现B-Tree索引最常见的索引类型,大部分引擎都支持B树索引可以范围查询HASH索引只有Memory引擎支持,使用场景简单查询速度快,但不适合范围查询R-Tree索引空间索引是MyISAM的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少Full-text索引全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从MySQL
5.6版本开始提供对全文索引的支持B-Tree索引的使用全值匹配type:const匹配值的范围查询type:range匹配最左索引type:ref比如三个列形成的联合索引i1i2i3,只有从左到右使用索引进行查询才算使用了索引,否则不使用索引,如i1和i3最左匹配原则算是MySQL中B-Tree索引使用的首要原则仅仅对索引进行查询type:ref,当查询的列都在索引字段中时,效率更高UsingIndex,仅仅需要访问索引,不需要根据索引访问表数据,它也称为覆盖索引扫描匹配列前缀type:range使用了前缀索引,并且只查询以XX开头的信息,这时Usingwhere,需要索引回表查询索引匹配精确,其他条件是范围匹配type:ref按照索引的精确匹配来选择如果列名是索引,那么column_nameisnull会使用索引如果查询条件中包含索引条件,首先使用该条件进行过滤,接着回表使用普通条件进行过滤查询这种情况在MySQL
5.6中进行了提升,使用ICP优化降低了不必要的IO访问,在回表的过程中就已经排除了不符合条件的记录不能使用索引的场合LIKE以%开头,不能使用索引解决办法先访问索引表,select索引字段,找到符合like%xxx%条件的记录,然后再select回表查询,省去了全表扫描的IO请求数据类型出现隐式转换时不会使用索引如字符串不加单引号,则不使用索引,使用全表扫描复合索引查询条件不包含最左边部分,不使用复合索引如果MySQL估计使用索引比全表扫描更慢,则不使用索引如全表查询输出的情况,使用索引浪费了查询索引的时间用or分割开的条件,如果or前的条件中列有索引,而后面的列没有索引,那么涉及的索引都不会被用到简单实用的优化方法定期分析和检查表,使得SQL能够生成正确的执行计划,检查表的作用是检查一个或多个表是否有错误定期优化表optimizetabletb_name,可以清理由于删除或者更新造成的碎片浪费只对MyISAM、BDB、InnoDB有效常用的SQL优化大批量导入数据使用loaddatainfile‘address’intotabletb_name,在导入之前关闭索引,导入之后打开索引ALTER TABLEtbl_nameDISABLE/ENABLEKEYS关闭唯一性校验,setunique_checks=0;关闭自动提交,导入结束后再打开优化INSERT语句采用多值插入,values…如果不同客户插入很多行,可以通过insertdelayed语句得到更高的速度,使得insert的数据存放到内存队列中,并不真正写入磁盘将索引文件和数据文件分开存放如果进行批量插入,可以增加bulk_insert_buffer_size来提高速度,只对MyISAM有效使用loaddatainfile替换insert,速度加快20倍优化ORDERBY语句MySQL有两种排序方式,第一种通过有序索引顺序扫描直接返回有序的数据,这种情况在explain的时候返回Usingindex,不需要额外排序另一种通过返回数据进行排序,通常称为Filesort排序,所有不是通过索引直接返回排序结构的排序都叫Filesort排序OrderBy的优化目标是尽量减少额外的排序,通过索引直接返回有序数据WHERE条件和ORDERBY条件使用相同的索引,并且ORDERBY的顺序和索引顺序相同,并且ORDERBY的字段都是升序或降序的,只有这样才能减少额外的排序对于不可避免的Filesort排序,有两种排序算法两次扫描算法根据条件取出排序字段和行指针信息,之后在排序区sortbuffer中排序优点是排序时内存开销较少,缺点是第二次读取的随机IO比较大一次扫描算法一次性取出满足条件的行的所有字段,然后在排序去sortbuffer中排序后直接输出结果集排序时内存开销比较大,但排序效率比两次扫描算法高优化GroupBy语句GroupBy默认根据后面的字段进行排序,如果不希望额外的排序,可以使用ORDERBYNULL来取消排序优化嵌套查询使用表连接JOIN替代嵌套查询,由于嵌套查询需在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作优化OR条件MySQL处理OR条件,实际上是对每个条件都查询一次,然后用Union合并这些查询,所以对每个OR条件都需要建索引优化分页查询使用limitmn时,MySQL实际上会全表扫描,然后获得需要的记录,丢弃不需要的记录,这样查询和排序的代价很高一种方法是表关联,和limitmn的索引进行内连接查询,可以使用索引加快查询,减少查询的行数另一种方法是记录上一次翻页的记录数,然后在查询时使用范围查询,并用limitn来查询,这样也不需要全表查询使用SQL提示显式加入提示达到优化目的USEINDEXXX添加USEINDEX来告诉MySQL参考哪个索引列表,可以让MySQL不再考虑其他可用的索引IGNOREINDEXXX指定需要忽略的索引FORCEINDEXXX有些时候,MySQL认为全表扫描会比索引查询更快,这时候可以使用FORCEINDEXXX来强制使用索引查询常用SQL技巧使用正则表达式Select‘abcde’REGEXP‘^a’’e$’,还可以使用”[^abc]”等等可以避免使用过多的like来进行匹配,方便查询使用RAND来提取随机行Select*fromxxorderbyrandlimit5;可以随机获取行数据利用GROUPBY的WITHROLLUP子句可以简单地实现合计,但不能和orderby一起使用,Limit子句放在withrollup之后使用bitgroupfunctions做统计Bit_or字段…groupby另外字段可以实现符合聚组条件的条目的指定字段进行位或操作Bit_and字段…groupbyxxx同上,与操作该方法可以简洁的数据表示丰富的信息,节省存储空间数据库名、表名的大小写会由不同的操作系统而不同,需要关注lower_case_tables_name属性来设置使用MyISAM存储引擎创建表时,可以使用外键约束语句,只是外键不起作用,在showcreatetabletb_name的时候也不显示出来,只是备忘和注释的作用优化数据库对象优化表的数据类型,尽量选择符合条件的占用空间最小的数据类型通过拆分表来提高表的访问效率垂直拆分一些列不常用时可以拆分,可以使数据行变小,一页可以放更多的信息,查询时可以减少IO次数缺点是需要管理冗余列,查询时需要JOIN水平拆分的使用场景表很大,分割后可以降低查询时需要读取的数据和索引的页数,降低了索引层数,提高查询速度表中的数据有独立性,比如日期独立,地点独立等需要把数据存放到多个介质上水平拆分会给应用增加复杂度,通常在查询时需要多个表名,查询时所有数据需要UNION操作进行水平拆分时要考虑数据量的增长速度,根据实际情况考虑是否需要对表进行拆分逆规范化(以空间换时间)增加冗余列避免连接查询增加派生列减少连接操作,避免使用集函数重新组表经常表连接的表可以组成一个表来减少连接分割表见上逆规范化的数据完整性保证批处理维护修改积累一定时间后运行批处理来对冗余和派生列进行修改实时性不高应用逻辑在应用操作时使用事务来保证一致性不易于维护,容易遗漏触发器对数据库的任何修改立刻出发对复制列和派生列的相应修改,易于维护,实时性高,是一种推荐的方法使用中间表提高统计查询速度中间表复制源表的部分数据,并且与源表相隔离,在中间表做查询不会对在线应用产生负面影响可以灵活地添加索引或增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询的作用数据库的锁问题MySQL的3种锁的特性表级锁开销小,加锁块,不会死锁;锁定粒度大,锁冲突概率最高,并发度最低MyISAM和MEMORY采用表级锁行级锁开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度高InnoDB采用行级锁,也支持表级锁,默认行级锁页面锁开销和加锁时间介于表锁和行锁之间;会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般BDB采用页面锁表级锁适合以查询为主,只有少量按索引条件更新数据的应用而行级锁适合有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如OLTP系统MyISAM的表锁监控锁可以使用showstatuslike‘table%’来查看是否存在严重的表级锁争用的情况锁模式MySQL的表级锁有两种模式表共享读锁和表独占写锁(同JAVA读写锁)加锁规则MyISAM在执行SELECT语句前,会自动给涉及的表加读锁,在执行UPDATE、DELETE、INSERT前,会加写锁,不需要手动LOCKTABLE命令显式加锁在自动枷锁的情况下,MyISAM会获取SQL语句锁需要的全部锁,这也是它不会出现死锁的原因注意在locktable时,如果在查询使用了别名,那么lock的时候也必须使用别名lock并发插入实质上,MyISAM支持并发插入,即查询时插入到表尾,由concurrent_insert系统变量来控制默认是如果没有空洞,则可以插入所以,定期执行optimizetable整理碎片,有利于加快MyISAM的查询和插入的并发MyISAM的锁调度同时申请读锁和写锁,写锁优先获得,而且等待队列中读锁先于写锁,也是写锁优先获取锁调度需要避免出现饥饿现象,如果写锁总是执行,可以降低写锁的优先级,让读锁能稍微运行同理,也尽量减少读锁占用的时间,防止写饥饿InnoDB锁问题监控锁查看InnoDB_row_lock状态可以分析系统上行锁争夺情况通过查询information_schema表可以了解锁等待情况select*frominnodb_locks\G;通过设置InnoDBMonitors观察锁冲突情况Createtableinnodb_monitoraintengine=InnoDB;showengineinnodbstatus\G;锁模式InnoDB实现了两种类型的锁(共享锁S和排他锁X),另外还实现了两种内部使用的意向锁表锁意向共享锁IS和意向排他锁IX加锁规则意向锁由InnoDB自动加上,不需要用户干预对于Update、Delete和Insert语句,InnoDB会自动给涉及数据集加排他锁X,对于普通SELECT,InnoDB不加锁可以通过SQL中显式获取锁,如selectxxxlockinsharemode,但如果select获取共享锁,容易导致死锁,推荐获取独占锁,forupdateInnoDB行锁的实现方式通过给索引上的索引项加锁来实现,如果没有索引,则通过隐藏的聚簇索引对记录加锁行锁分三种情况对索引项加锁对索引项之间的间隙加锁对记录及其前面的间隙加锁注意因为上述的特性,所以如果InnoDB不使用索引来查询时,会导致行锁退化成表锁,降低性能由于针对索引加锁,如果使用相同的索引键查询,也会导致锁冲突当表有多个索引的时候,不同的事务可以使用不同索引锁定不同行,无论是主键索引、唯一索引或普通索引,都会使用行锁来对数据加锁即使再条件中使用索引字段,如果MySQL认为全表扫描效率更高,也会采用表锁Next-Key锁当我们采用范围条件查询而不是相等条件查询时,InnoDB会把这个条件对应的间隙也锁定,以防止幻读读入了新插入的数据,并满足恢复和复制的需要由于这种方法会阻塞所有符合条件的记录,所以在使用时,尽量使用相等条件来访问更新数据,避免使用范围条件另外,如果InnoDB使用相等条件请求一个不存在的记录加锁,也会是用Next-Key锁InnoDB的恢复和复制的需要MySQL通过BINLOG记录执行成功的INSERT、UPDATE、DELETE等更新数据的SQL语句,并由此实现MySQL数据库的恢复和主从复制MySQL
5.6新增了四种复制模式基于SQL语句的复制SBR,基于行数据的复制RBR,混合复制,使用全局事务ID的复制InnoDB锁的使用应用中尽可能降低事务隔离级别,减少锁冲突,可以动态更改事务隔离级别来实现要求高的需求在必要的情况使用表锁代替行锁需要大量更新数据,或事务涉及多个表,可能引起死锁注意在锁表的解锁时必须先提交,否则unlocktables会隐含提交事务关于死锁,死锁的发生和死锁的避免在应用中,如果不同程序并发存取多个表,应约定以相同顺序访问表,防止死锁在程序以批处理方式处理数据时,若先对数据排序,保证每个线程按固定顺序来处理记录,也可以降低出现死锁的可能更新记录尽量选用排他锁两个事务隔离级别RepeatableRead的前提下同时查询不存在数据,都能加锁成功,造成死锁,可以降低隔离级别来解决如果出现死锁,使用showinnodbstatus命令来确定最后一个死锁产生的原因事务的特性?原子性Atomicity事务是一个原子操作单元,对数据的修改要么都执行,要么都不执行,不可拆分一致性Consistent事务开始和完成,数据都必须保持一致状态事务开始和结束时,所有内部数据结构都是正确的隔离性Isolation数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的独立环境执行这意味着事务处理过程中的中间状态对外部不可见持久性Durable事务完成后,对数据的修改时永久的,即使出现系统故障也能保持并发事务处理带来的问题?更新丢失最后的更新覆盖了由其他事务所做的更新脏读事务读到了其他事务未提交的数据不可重复读一个事务某时间先读了某数据,再次读取发现读出的数据已经发生改变读到其他事务已提交的数据幻读一个事务读到了其他事务插入的新数据事务的隔离级别的实现方式?MySQL的4种隔离级别?实现方式在读取数据前,加锁,阻止其他事务对数据进行修改通过一定机制生成一个数据请求时间点的一致性数据快照,并用这个快债提供一定级别的一致性读取这种技术叫数据多版本并发控制MVCC,也常称为多版本数据库隔离级别Readuncommitted未提交读最低级别,只保证不读取物理上损坏的数据Readcommitted已提交读语句级,可以防止脏读Repeatableread可重复读事务级,可以防止脏读和不可重复读Serializable可序列化最高级别,事务级,可以防止脏读、不可重复读和幻读Oracle只有Readcommitted和Serializable两种,还有自定义的ReadOnlySqlServer除了4种以外,还有快照隔离级别MySQL的缓存机制?InnoDB缓存InnoDB用一块内存区做IO缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存InnoDB的数据块,这一点与MyISAM不同内部来看,InnoDB缓存池逻辑上由freelist、flushlist和LRUlist组成分别为空闲缓存块列表、需要刷新到磁盘的缓存块列表、InnoDB正在使用的缓存块,LRUlist是InnoDBbufferpool的核心由于Innodb_buffer_pool_size决定InnoDB存储引擎表数据和索引数据的最大缓存区大小,越大则缓冲命中率越高,一般设置80%的物理内存InnoDB的doublewrite机制MySQL的数据页16KB,操作系统IO数据页4KB这里会导致断写或部分写简单来说,就是写两份,一份到IO一份到buffer,如果redo发现不一致的页,则用Buffer来替换MySQL应用层面的优化使用数据库连接池大大减少了创建新连接锁耗费的资源,连接返回后,本次访问的连接还要还给连接池避免对统一数据做重复检索尽量减少SQL查询的次数,尽量在一句SQL完成所有功能使用查询缓存适用于对象更新不频繁的表,当表更改后,查询缓存的相关条目会被清空增加CACHE层在应用端增加CACHE层来减轻数据库负担的目的(CACHE如何刷新?多久刷新?)负载均衡它的机制就是利用某种均衡算法,将固定的负载量分布到不同的服务器上,以此来减轻单台服务器的负载,达到优化的目的数据库层常用做法利用MySQL复制分流查询操作主从复制主要问题是主数据库更新频繁或者网络出现问题的时候,主从之间的数据可能存在比较大的延迟更新,从而造成查询结果和主数据库上有差异一致性采用分布式数据库架构适合大数据量、负载高的情况,具有良好的可扩展性和高可用性局限是分布式事务只支持InnoDB引擎。