java面试——数据库优化方面
一、定位:查找、定位慢查询
1、查找并定位慢查询
在项目自验转测试之前,在启动mysql时开启慢查询,并且把执行慢的语句写到日志中,在运行一定的时间后,查找日志。通过查看日志,找到慢查询语句。使用explain,来详细分析语句的问题。
二、优化手段
1、使用索引
创建合适的索引,就可以在索引中查询,查询到以后直接找相对应的记录
①索引是什么 —— 一种帮助DBMS高效获取数据的数据结构
②分类
普通索引:允许重复值出现
唯一索引:不能有重复的记录,其它与普通索引相同
主键索引:随着设定主键而创建的,唯一且没有null值
全文索引:对表中文本域进行索引,只在myisam中有效
缺点:
①、占用磁盘空间
②、使dml(插删改)变慢
因此如果不查询的字段,创建索引就无意义,不是只有几个值的字段,变化不频繁的字段,也不使用索引。
2、分表
当一张表的数据比较多,或者一些表的字段的值比较多,我们就可以水平分表,或者垂直分表来优化。
①、水平分表
根据经验,当Mysql数据到达百万级别,查询效率会很低,容易造成表锁,堆积连接,直到挂掉,因此水平分表能减少压力。
(1)、按时间分表--时效性较强
(2)、按区间分表
(3)、hash分表
②、垂直分表
很少情况下会查询,字段值又多,就把多的字段通过外键关联,单独分到一个表中。
3、读写分离
一台服务器不能满足要求,采用读写分离的方式进行集群。
一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求时,就可以集群处理。其中读写分离是最常用的集群技术。
①、确保主从要同步
确保不同数据库服务器的数据是一致的。 能改变数据库的操作都往主数据库去写。其它的数据库从主数据库上同步数据。
②、使用负载均衡
使用负载均衡来实现写的操作都往主数据库去,而读的操作都往从数据库。
4、使用缓存技术
在持久层,和数据库之间添加一个缓存层。 用户访问时,可以直接从缓存中获取。
①、memcached 不支持分布式缓存
②、使用redis来做*缓存
5、SQL语句优化
①、批量插入数据,先去除键,操作完成后,再恢复。
②、关闭唯一效验
③、修改事务的提交方式
④、变多次提交为一次
⑤、Order by多使用索引排序
⑥、确保on上面的字段有索引
⑦、明确写出要查询的列,尽量不使用*
⑧、尽量不要在where里面使用不等号或者null值判断,或者使用like,会导致全表扫描
⑨、可使用exist代替in
三、选择合适的存储引擎
1、MyISAM存储引擎
对事务要求不高,同时以查询和添加为主,查询添加
2、INNODB
对事务要求高,保存的都是重要数据
3、Memory
数据变换频繁,不需入库,速度极快,查询修改