登录

立即登录

去注册

忘记密码?

验证码登录

点击获取验证码

立即登录

去注册

注册

点击获取验证码

立即注册

找回密码

点击获取验证码

确定

全部资讯

全部资讯   / 大厂面试补充题目

大厂面试补充题目

2021-12-24 11:45:19

<p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;"><a name="_Toc6903"></a>1.&nbsp;jdk1.7到jdk1.8 Map发生了什么变化(底层)?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">1.8之后hashMap的数据结构发生了变化,从之前的单纯的数组+链表结构变成数组+链表+红黑树。也就是说在JVM存储hashMap的K-V时仅仅通过key来决定每一个entry的存储槽位(Node[]中的index)。并且Value以链表的形式挂在到对应槽位上(1.8以后如果value长度大于8则转为红黑树)。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">但是hashmap1.7跟1.8 中都没有任何同步操作,容易出现并发问题,甚至出现死循环导致系统不可用。解决方案是jdk的ConcurrentHashMap,位于java.util.concurrent下,专门解决并发问题。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;"><a name="_Toc6297"></a>2.&nbsp;ConcurrentHashMap<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">思路与hashMap差不多,但是支持并发操作,要复杂很多<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;"><a name="_Toc24943"></a>3.&nbsp;并行跟并发有什么区别?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">并发:指应用交替执行不同的任务,多线程原理<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">并行:指应用同时执行不用的任务<o:p></o:p></p><p class="MsoNormal" align="justify" style="margin: 0pt 0pt 0.0001pt;">区别:一个是交替执行,一个是同时执行。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;"><a name="_Toc18731"></a>4.&nbsp;jdk1.7到jdk1.8 java虚拟机发生了什么变化?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 21pt;">JVM中内存份为堆、栈内存,及方法区。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 21pt;">栈内存主要用途:执行线程方法,存放本地临时变量与线程方法执行是需要的引用对象的地址。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 21pt;">堆内存主要用途:JVM中所有对象信息都存放在堆内存中,相比栈内存,堆内存大很多所以JVM一直通过对堆内存划分不同功能区块实现对堆内存中对象管理。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 21pt;">堆内存不够常见错误:OutOfMemoryError<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 21pt;">栈内存溢出常见错误:StackOverFlowError<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">在JDK7以及其前期的JDK版本中,堆内存通常被分为三块区域Nursery内存(young generation)、长时内存(old generation)、永久内存(Permanent Generation for VM Matedata),显示如下图:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 21pt;">&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">在最上面一层是Nursery内存,一个对象被创建以后首先被房到Nuersery中的Eden内存中,如果存活周期超过两个Survivor(生存周期)之后会被转移到Old Generation中。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">永久内存中存放对象的方法、变量等元数据信息。永久内存不够就会出现 以下错误:java.lang.OutOfMemoryError:PermGen<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">但是在JDK1.8中一般都不会得到这个错误,原因在于:1.8中把存放元数据的永久内存从堆内存中已到了本地内存(native Memory)中,1.8中JVM内存结构变成了如下图:<img width="1280" height="529" src="file:////private/var/folders/6v/_3djq2xs207bh_1gnfj1kjgc0000gn/T/com.kingsoft.wpsoffice.mac/wps-llinda/ksohtml/wpskz2V4V.jpg"><o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">这样永久内存就不占用堆内存,可以通过自增长来避免永久内存错误。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">-XX:MaxMetaspaceSize=128m 这只最大的远内存空间128兆<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">JDK1.8移除PermGen,取而代之的是MetaSpace源空间<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">MetaSpace 垃圾回收:对僵死的类及类加载器的垃圾回收机制昂在元数据使用达到“MaxMetaSpaceSize”参数的设定值时运行。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">MetaSpace 监控:元空间的使用情况可以在HotSpot1.8的详细GC日志输出中得到。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">更新JDK1.8的原因:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">1.字符串存在永久代当中,容易出现性能问题和内存溢出<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">2.类及方法的信息比较难确定其大小,因此对永久代的大小制定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">3.永久代会为GC带来不必要的复杂度,并且回收效率偏低<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">4.Oracle可能会想HotSpot 与 JRockit 合并。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;"><a name="_Toc29932"></a>5.&nbsp;如果叫你自己设计一个中间件,你会如何设计?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">我会从以下几点方面考虑开发:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">1)&nbsp;远程过程调用<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">2)&nbsp;面向消息:利用搞笑的消息传递机制进行平台无关的数据交流,并给予数据通信来进行分布式系统的集成,有一下三个特点:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 189pt;">i)&nbsp;通讯程序可以在不同的时间运行<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 189pt;">ii)&nbsp;通讯晨旭之家可以一对一、一对多、多对一甚至是上述多种方式的混合<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 189pt;">iii)&nbsp;程序将消息放入消息队列会从小吸毒列中取出消息来进行通讯<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">3)&nbsp;对象请求代理:提供不同形式的通讯服务包括同步、排队、订阅发布、广播等。可构筑各种框架如:事物处理监控器、分布数据访问、对象事务管理器OTM等。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">4)&nbsp;事物处理监控有一下功能:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 63pt;">a)&nbsp;进程管理,包括启动server进程、分配任务、监控其执行并对负载进行平衡<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 63pt;">b)&nbsp;事务管理,保证在其监控下的事务处理的原子性、一致性、独立性和持久性<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 63pt;">c)&nbsp;通讯管理,为client和server之间提供多种通讯机制,包括请求响应、会话、排队、订阅发布和广播等<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;"><a name="_Toc3006"></a>6.&nbsp;什么是中间件?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">中间件是处于操作系统和应用程序之间软件,使用时旺旺是一组中间件集成在一起,构成一个平台(开发平台+运行平台),在这组中间件中必须要有一个通信中间件,即中间件=平台+通信。该定义也限定了只有勇于分布式系统中才能称为中间件<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">主要分类:远程过程调用、面向消息的中间件、对象请求代理、事物处理监控。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;"><a name="_Toc28730"></a>&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">7.&nbsp;ThreadLock用过没有,说说它的作用?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">ThreadLock为本地线程,为每一个线程提供一个局部变量,也就是说只有当前线层可以访问,是线程安全的。原理:为每一个线程分配一个对象来工作,并不是由ThreadLock来完成的,而是需要在应用层面保证的,ThreadLock只是起到了一个容器的作用。原理为ThreadLock的set()跟get()方法。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">实现原理:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">public void set(T value) {<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread t = Thread.currentThread();<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadLocalMap map = getMap(t);<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (map != null)<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.set(this, value);<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createMap(t, value);<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;}<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">public T get() {<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread t = Thread.currentThread();<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadLocalMap map = getMap(t);<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (map != null) {<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadLocalMap.Entry e = map.getEntry(this);<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (e != null)<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (T)e.value;<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return setInitialValue();<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">&nbsp;&nbsp;&nbsp;&nbsp;}<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">8.&nbsp;dubbox和spring cloud区别?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">9.&nbsp;dubbox的源码看过没,dubbox有哪些组件,介绍下?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">10.&nbsp;Hashcode()和equals()和==区别?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(1)&nbsp;hashcode()方法跟equals()在java中都是判断两个对象是否相等<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(2)&nbsp;两个对象相同,则hashcode至一定要相同,即对象相同 ----&gt;成员变量相同 ----&gt;hashcode值一定相同<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(3)&nbsp;两个对象的hashcode值相同,对象不一定相等。总结:equals相等则hashcode一定相等,hashcode相等,equals不一定相等。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(4)&nbsp;==比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间)<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">11.&nbsp;mysql数据库中,什么情况下设置了索引但无法使用?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(1)&nbsp;索引的作用:在数据库表中对字段建立索引可以大大提高查询速度。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(2)&nbsp;Mysql索引类型:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">a)&nbsp;普通索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">b)&nbsp;唯一索引:唯一索引列的值必须唯一允许有空值,如果是组合索引,则列值的组合必须唯一:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">CREATE UNIQUE INDEX indexName ON mytable(username(length))<br>-- 修改表结构<br>ALTER mytable ADD UNIQUE [indexName] ON (username(length))<br>-- 创建表的时候直接指定<br>CREATE TABLE mytable(&nbsp;ID INT NOT NULL,&nbsp;&nbsp;&nbsp; username VARCHAR(16) NOT NULL,&nbsp;UNIQUE [indexName] (username(length))&nbsp;&nbsp; );<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">c)&nbsp;主键索引:一种特殊的唯一索引,不允许有空值,一般在创建表的时候创建主键索引:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">CREATE TABLE mytable(&nbsp;&nbsp; ID INT NOT NULL,&nbsp;&nbsp;&nbsp; username VARCHAR(16) NOT NULL,&nbsp;&nbsp; PRIMARY KEY(ID)&nbsp;&nbsp; );<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">d)&nbsp;组合索引:CREATE TABLE mytable(&nbsp;&nbsp; ID INT NOT NULL,&nbsp;&nbsp;&nbsp; username VARCHAR(16) NOT NULL,&nbsp;&nbsp; city VARCHAR(50) NOT NULL,&nbsp;&nbsp; age INT NOT NULL&nbsp; );<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是 将 name, city, age建到一个索引里:代码如下:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(3)&nbsp;什么情况下有索引,但用不上?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">a)&nbsp;如果条件中有OR,即使其中有部分条件带索引也不会使用。注意:要想使用or,又想让索引生效,只能将or条件中的每个<a href="https://www.baidu.com/s?wd=%E5%88%97%E9%83%BD&amp;tn=24004469_oem_dg&amp;rsv_dl=gh_pl_sl_csd">列都</a>加上索引。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">b)&nbsp;对于多了索引,不是使用的第一部分,则不会使用索引。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">c)&nbsp;Like查询以%开头,不使用索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">d)&nbsp;存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">e)&nbsp;Where 子句里对索引列上有数学运算,用不上索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">f)&nbsp;Where 子句中对索引列使用函数,用不上索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">g)&nbsp;Mysql估计使用全表扫描要比用索引快,不使用索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(4)&nbsp;什么情况下不推荐使用索引?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">a)&nbsp;数据唯一性差的字段不要使用索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">b)&nbsp;频繁更新的字段不要使用索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">c)&nbsp;字段不在where语句中出现时不要添加索引,如果where后含IS NULL/IS NOT NULL/LIKE ‘%输入符%’等条件,不要使用索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">d)&nbsp;Where子句里对索引使用不等于(&lt;&gt;),不建议使用索引,效果一般<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">12.&nbsp;mysql优化会不会,mycat分库,垂直分库,水平分库?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(1)&nbsp;为查询缓存优化你的查询<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(2)&nbsp;EXPLAIN select查询:explain 的查询结果会告诉你索引主键是如何被利用的<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(3)&nbsp;只需要一行数据时使用limit1<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(4)&nbsp;为搜索字段添加索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(5)&nbsp;在关联表的时候使用相当类型的例,并将其索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(6)&nbsp;千万不要ORDER BY RAND()<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(7)&nbsp;避免select*<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(8)&nbsp;永远为每张表设置一个ID<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(9)&nbsp;使用ENUM而不是VARCHAR<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(10)&nbsp;从PROCEDURE ANALYS()提取建议<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(11)&nbsp;尽可能的使用NOT NULL<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(12)&nbsp;Java中使用Prepared Statements<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(13)&nbsp;无缓冲的查询<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(14)&nbsp;把IP地址存成UNSIGNED INT<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(15)&nbsp;固定表的长度<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(16)&nbsp;垂直分库:“垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(17)&nbsp;水平分库:“水平分割”是一种把数据库中的表按行变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(18)&nbsp;越小的列会越快<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(19)&nbsp;选择正确的存储引擎<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(20)&nbsp;使用一个对象关系映射器<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(21)&nbsp;小心永久链接<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(22)&nbsp;拆分大的DELETE活INSERT语句<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">13.&nbsp;分布式事务解决方案?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(1)&nbsp;什么是分布式事务?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">a.&nbsp;什么情况下需要用到分布式事务?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">a)&nbsp;当本地数据库断电、机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠TCP、存储数据丢失、其他异常等需要用到分布式事务。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">b)&nbsp;例如:当本地事务数据库断电的这种秦光,如何保证数据一致性?数据库由连个文件组成的,一个数据库文件和一个日志文件,数据库任何写入操作都要先写日志,在操作前会吧日志文件写入磁盘,那么断电的时候及时才做没有完成,在重启数据库的时候,数据库会根据当前数据情况进行undo回滚活redo前滚,保证了数据的强一致性。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">c)&nbsp;分布式理论:当单个数据库性能产生瓶颈的时候,可能会对数据库进行分区(物理分区),分区之后不同的数据库不同的服务器上 ,此时单个数据库的ACID不适应这种清苦啊,在此集群环境下很难达到集群的ACID,甚至效率性能大幅度下降,重要的是再很难扩展新的分区了。此时就需要引用一个新的理论来使用这种集群情况:CAP定理<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">d)&nbsp;CAP定理:由加州肚饿伯克利分销Eric Brewer教授提出,指出WEB服务无法同时满足3个属性:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 189pt;">a.&nbsp;一致性:客户端知道一系列的操作都会同时发生(生效)<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 189pt;">b.&nbsp;可用性:每个操作都必须以可预期的响应结束<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 189pt;">c.&nbsp;分区容错性:及时出现单组件无法可用,操作依然可以完成。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">具体的将在分布式系统中,在任何数据库设计中,一个WEB应<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">至多只能同时支持上面两个属性。设计人员必须在一致性和可用<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">性之间做出选择。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">e)&nbsp;BASE理论:分布式系统中追求的是可用性,比一致性更加重要,BASE理论来实现高可用性。核心思想是:我们无法做到羟乙酯,单每个应用都可以根据自身的业务特点,采用适当的方式使系统达到最终一致性。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 126pt;">f)&nbsp;数据库事务特性:ACID<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">i.&nbsp;原子性<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">ii.&nbsp;一致性<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">iii.&nbsp;独立性或隔离性<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">iv.&nbsp;持久性<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(2)&nbsp;分布式系统中,实现分布式事务的解决方案:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">a.&nbsp;两阶段提交2PC<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">b.&nbsp;补偿事务TCC<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">c.&nbsp;本地消息表(异步确保)<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">d.&nbsp;MQ事务消息<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 105pt;">e.&nbsp;Sagas事务模型<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(3)&nbsp;<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">14.&nbsp;sql语句优化会不会,说出你知道的?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(1)&nbsp;避免在列上做运算,可能会导致索引失败<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(2)&nbsp;使用join时应该小结果集驱动大结果集,同时把复杂的join查询拆分成多个query,不然join越多表,会导致越多的锁定和堵塞。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(3)&nbsp;注意like模糊查询的使用,避免使用%%<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(4)&nbsp;不要使用select * 节省内存<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(5)&nbsp;使用批量插入语句,节省交互<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(6)&nbsp;Limit基数比较大时,使用between &nbsp;and<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(7)&nbsp;不要使用rand函数随机获取记录<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(8)&nbsp;避免使用null,建表时,尽量设置not nul,提高查询性能<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(9)&nbsp;不要使用count(id),应该使用count(*)<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(10)&nbsp;不要做无谓的排序,尽可能在索引中完成排序<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(11)&nbsp;From语句中一定不要使用子查询<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(12)&nbsp;使用更多的where加以限制,缩小查找范围<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(13)&nbsp;合理运用索引<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(14)&nbsp;使用explain查看sql性能<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">15.&nbsp;mysql的存储引擎了解过没有?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(1)&nbsp;MySQL存储引擎种类:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 21pt;">&nbsp;</p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(2)&nbsp;<a href="https://blog.csdn.net/m0_37888031/article/details/80704344">https://blog.csdn.net/m0_37888031/article/details/80704344</a><o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(3)&nbsp;https://blog.csdn.net/m0_37888031/article/details/80664138<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(4)&nbsp;事务处理:在整个流程中出现任何问题,都能让数据回滚到最开始的状态,这种处理方式称之为事务处理。也就是说事务处理要么都成功,要么的失败。<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt;">16.&nbsp;红黑树原理?<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 42pt;">(1)&nbsp;红黑树的性质:红黑树是一个二叉搜索树。在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK,通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的两倍,加以平衡。性质如下:<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">i.&nbsp;每个节点颜色不是黑色就是红色<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">ii.&nbsp;根节点的颜色是黑色的<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">iii.&nbsp;如果一个节点是红色,那么他的两个子节点就是黑色的,没有持续的红节点<o:p></o:p></p><p class="MsoNormal" style="margin: 0pt 0pt 0.0001pt 147pt;">iv.&nbsp;对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点。<b style="font-family: Calibri; font-size: 10.5pt;"><span style="font-family: 宋体; color: rgb(0, 0, 255); font-size: 14pt;"><o:p></o:p></span></b></p>

上一篇 下一篇

热门资讯