1、Union和Union all的区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union all:对两个结果集进行并集操作,包括重复行,不进行排序。
2、数据库的优化
1)选取最合适字段属性
关系型数据库可以支持大数据量的存取,但是一般来说表越小,它执行的速度也就会越快。因此,在新建表的时候,在满足我们业务需求的基础上,尽可能的将字段的宽度设置的小一点。
2)数据库索引
索引是提高数据库性能最常用的方法,它可以大大提高数据库查询的效率,尤其是在查询语句当中包含有MAX(),MIN()和ORDER BY这些函数和语句的时候,性能提高更为明显。
通常情况,索引应建立在那些将用于JOIN连接,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。如用户表中的性别字段就不适合创建索引(因为性别只有男或女两个值),在这样的字段上创建索引不仅不会提高数据库查询的效率,反而有可能降低数据库的性能。
索引并不是越多越好,索引固然可以提高相应的SELECT的效率,但同时也降低了INSERT及UPDATE 的效率,因为INSERT或UPDATE 时有会更新索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
3、Sql优化
1)尽量避免使用子查询,可以使用JOIN链接查询替代
常用的关系型数据库都支持子查询,子查询使用SELECT语句创建一个查询结果,然后把这个结果作为一张临时表用在另一个查询中。使用子查询可以一次完成多步SQL操作,也可以避免事务或者表锁死,且写起来比较容易。但是使用子查询MYSQL会在内存中创建一张临时表供外层查询使用,所以会降低查询的效率。这时候我们可以使用JOIN链接操作来替代子查询。
2)UNION All能满足业务需求不要使用UNION
如果我们需要将两个或者多个SELECT语句的结果作为合并为一个整体显示出来,我们可以用UNION或者UNION ALL关键字。UNION(联合)和UNION ALL的作用是将多个结果合并在一起显示出来。
两者的区别是:
UNION会自动压缩多个结果集合中的重复结果,而UNION ALL 则将所有的结果全部显示出来,不管是不是重复。所以当UNION ALL能满足业务需求的时候,尽量使用UNION ALL而不用UNION。
3) WHERE子句尽量避免使用!=或<>操作符
在WHERE子句中使用!=或<>操作符,查询条件不会使用索引,会进行全表查询。即影响查询效率。
4) WHERE子句使用OR的优化
通常情况我们可以使用UNION ALL或UNION的方式替换OR会得到更好的效果。因为WHERE子句中使用了OR,将不会使用索引。
5)WHERE子句使用IN或NOT IN优化
IN和NOT IN也要慎用,否则可能会导致全表扫描。
6) WHERE子句中使用IS NULL或IS NOT NULL优化
在WHERE子句中使用IS NULL或IS NOT NULL判断,索引将被放弃使用,会进行全表查询。
7) LIKE语句优化
一般情况下不建议使用LIKE操作,特别是数据量较大的表。
8) WHERE子句中避免对字段进行表达式操作
尽量不要在WHERE子句中的=左边进行函数、算数运算或其他表达式运算,否则系统将无法正确使用索引。
9)一定不要用SELECT * FROM TABLENAME
在定义SQL语句字段列表替换"*",尽量避免返回无用的时候,要用具体的的字段。
10) LIMIT分页优化
MYSQL数据库实现分页一般都会使用LIMIT,但是当偏移量比较大时,LIMIT的效率会非常低,导致查询超时。
4、Linux查看进程
1)ps命令------显示所有运行中的进程
2)top命令------top命令提供了运行中系统的动态实时视图
3)显示进程的树状图------pstree以树状显示正在运行的进程
4)使用pgrep命令------pgrep能查找当前正在运行的进程并列出符合条件的进程ID
5)htop是一个类似top的交互式进程查看工具,但是可以垂直和水平滚动来查看所有进程和他们的命令行------进程的相关操作(killing,renicing)不需要输入PID。要安装htop输入命令
6)atop工具------atop是一个用来查看Linux系统负载的交互式监控工具。它能展现系统层级的关键硬件资源(从性能角度)的使用情况,如CPU、内存、硬盘和网络。
5、cookie和session的区别
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
6、Java序列化
序列化:把对象转为字节序列的过程称为对象的序列化;
什么时候需要序列化
把内存中的对象状态保存到一个文件或数据库中的时候;用套接字在网络上传送对象的时候。
如何实现序列化
我们自己实现一个Person类,在类当中定义成员变量name,age,sex,stuId,count,如果要将Person进行序列化只需要实现Serializable接口即可。
7、怎么解决线程安全问题
第一种方法:同步代码块
格式:
synchronized(锁对象) {
可能会出现线程安全问题的代码(访问共享数据的代码)
}
注意:
1、通过代码块的锁对象,可以是任意的对象
2、必须保证多个线程使用的锁对象是同一个
3、锁对象的作用是把同步代码快锁住,只允许一个线程在同步代码块执行
同步代码块的原理:
使用了一个锁对象,叫同步锁,对象锁,也叫同步监视器,当开启多个线程的时候,多个线程就开始抢夺CPU的执行权,比如现在t0线程首先的到执行,就会开始执行run方法,遇到同步代码快,首先检查是否有锁对象,发现有,则获取该锁对象,执行同步代码块中的代码。之后当CUP切换线程时,比如t1得到执行,也开始执行run方法,但是遇到同步代码块检查是否有锁对象时发现没有锁对象,t1便被阻塞,等待t0执行完毕同步代码块,释放锁对象,t1才可以获取从而进入同步代码块执行。
同步中的线程,没有执行完毕是不会释放锁的,这样便实现了线程对临界区的互斥访问,保证了共享数据安全。
缺点:频繁的获取释放锁对象,降低程序效率
第二种方法:同步方法
使用步骤:
1、把访问了共享数据的代码抽取出来,放到一个方法中
2、在该方法上添加 synchronized 修饰符
格式:
修饰符 synchronized 返回值类型 方法名称(参数列表) {
method body
}
同步方法的也是一样锁住同步的代码,但是锁对象的是Runable实现类对象,也就是this,谁调用方法,就是谁,在这里就是创建的run对象
静态的同步方法,添加一个静态static修饰符,此时锁对象就不是this了,静态同步方法的锁对象是本类的class属性,class文件对象(反射)
第三种方法:Lock接口
java.util.concurrent.locks.Lock
Lock接口中的方法:
void lock():获取锁
void unlock():释放锁
Lock接口的一个实现类
java.util.concurrent.locks.ReentrantLock implements Lock接口
使用方法:
1、在Runable实现类的成员变量创建一个ReentrantLock对象
2、在可能产生线程安全问题的代码前该对象调用lock方法获取锁
3、在可能产生线程安全问题的代码后该对象调用unlock方法获取锁