1.有没有做过数据库优化的事情?
查找、定位慢查询,并优化
创建索引:创建合适的索引提高查询速度
分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且使用时改用水平分表和垂直分表来优化
读写分离(集群):当一台服务器不能满足需要时,采用读写分离的方式进行集群
缓存:使用redis来进行缓存
2.数据库优化的读写分离
一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求可以集群处理。而Mysql集群处理技术最常用的就是读写分离。
主从同步
数据库最终回吧数据持久化到磁盘,如果集群必须确保每个数据库服务器的数据是一致。能改吧数据库数据的操作都往主数据库去写,而其他的数据库从主数据库上同步数据。
读写分离
使用负载均衡来实现写的操作都往主数据库去,而读的操作往从的服务器去
3.maven——添加插件和添加依赖有什么区别?
依赖:运行时开发时都需要用到的jar包,比如项目中需要一个Json的jar包,就要添加一个依赖,这个依赖在项目运行时也需要,因此在项目打包时需要把这些依赖也打包进项目里;
插件:在项目开的发时需要,但是在项目运行时不需要,因此在项目开发完成后不需要把插件打包进项目中,比如有个可以自动生成getter和setter的插件,嗯对~这就是插件了,因为这玩意在编译时生成getter和setter,编译结束后就没用了,所以项目打包时并不需要把插件放进去
4.Linux常用命令?
常用:
pwd获取当前路径
cd 跳转到目录
su -u 切换到管理员
ls、ll列举目录
文件操作命令:
文件
tail查看
rm -rf删除
vi修改
文件夹
mkdir创建
rm -rf删除
5.有没有使用过redis?什么时候使用redis?
Redsi是一个key-value的nosql数据库,先存到内存中,会根据一定的策略持久化到磁盘,即使断电也不会丢失数据,支持的数据类型比较多。
主要用来做缓存数据库的数据和web集群时当做中央缓存存放session。
把经常需要查询的数据很少修改的数据,放到读速度很快的空间(内存),以便下次访问减少时间,减轻压力,减少访问时间。
redis的计数器是原子性的内存操作。
可以解决库存溢出问题,进销存系统库存溢出。
session缓存服务器:
web集群时作为session缓存服务器。
6.SQL优化小技巧
DDL优化:通过禁用索引来提供导入数据性能。这个操作主要针对有数据库的表,追加数据。
//去除sql
alter table test DISABLE keys;
//批量插入数据
insert into test select * from test;
//恢复sql
alter table test ENABLE keys;
关闭唯一校验
set unique_checks=0 关闭
set uniques_checks=1 开启
修改事务提交方式(导入数据时,变多次提交为一次)
set autocommit=0;关闭
//批量插入
set autocommit=1;开启
DML优化(变多次提交为一次)
insert into test values(1,2);
insert into test values(1,3);
insert into test values(1,4);
inset into test values(1,2),(1,3),(1,3);
DQL优化
Order by 优化
多用索引排序
普通结果排序(非索引排序)Filesort
group by优化
是使用order by null,取消默认排序
7.批量插入几百万数据怎么实现?
变多次提交为一次
使用批量操作
建议使用存储过程操作
8.Java怎么访问redis?
使用jdesi java客户端来访问redis服务器,类似通过jdbc访问mysql。
如果使用spring集成,使用spring data来访问redis,只是对jedis的二次封装。jdbcTemplate jdbc关机一下
9.数据库优化怎么分表?
分表分为水平(按行)分表和垂直(按列)分表
根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多链接,直接挂掉;水平分表能够很大程度减少这些压力。
水平分表策略:
按时间分表:这种方式表达有一定的局限性,当数据有较强的时效性,如微博发送记录、微信消息记录等,这种数据很少有用户会查询几个月前的数据,可以按月分表。
按区间范围分表:一般在有严格的自增ID需求上,如按照user_id水平分表;
table1 user_id从1~100w
table2 user_id从101w~200w
…
hash分表:通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名;
如果一张表中某个字段值非常多(长文本、二进制等),而且只有在很少的情况下查询。这时候就可以把字段多个单独放到一个表,通过外键关联起来。
10.数据库怎么通过缓存优化?
在持久层dao和数据库db之间添加一个缓存层,如果用户访问的数据已经缓存起来,在用户访问时直接从缓存中获取,不用访问数据库,而缓存是在操作内存级,访问速度快。
作用:减少数据库服务器压力,减少访问时间。
也可以使用hibernate缓存,但是缺点是不能支持分布式缓存。
可以使用redis作为中央缓存。
11.如何查询和定位慢查询?
通过查看日志找到慢查询语句
使用explain慢查询语句,来分析语句的问题。
12.数据库优化之创建合适的索引?
索引(Index)是帮助DBMS高效获取数据的数据结构。
分类:普通索引/唯一索引/主键索引/全文索引
普通索引:允许重复的值出现
唯一索引:除了不能有重复的记录外,其它和普通索引一样(用户名、用户身份证、email,tel)
主键索引:是随着设定主键而创建的,也就是把某个列设为主键的时候,数据库就会給改列创建索引。这就是主键索引.唯一且没有null值
全文索引:用来对表中的文本域(char,varchar,text)进行索引, 全文索引针对MyIsam
explain select * from articles where match(title,body) against(‘database’);【会使用全文索引】
13.索引使用小技巧?
索引弊端
1.占用磁盘空间。
2.对dml(插入、修改、删除)操作有影响,变慢。
使用场景:
a: 肯定在where条件经常使用,如果不做查询就没有意义
b: 该字段的内容不是唯一的几个值(sex)
c: 字段内容不是频繁变化.
具体技巧:
- 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引。
alter table dept add index my_ind (dname,loc); // dname 左边的列,loc就是右边的列
explain select * from dept where dname=‘aaa’\G 会使用到索引
explain select * from dept where loc=‘aaa’\G 就不会使用到索引
-
对于使用like的查询,查询如果是’%aaa’不会使用到索引而‘aaa%’会使用到索引。
explain select * from dept where dname like ‘%aaa’\G不能使用索引
explain select * from dept where dname like ‘aaa%’\G使用索引.
所以在like查询时,‘关键字’的最前面不能使用 % 或者 _这样的字符.,如果一定要前面有变化的值,则考虑使用 全文索引->sphinx.
-
如果条件中有or,有条件没有使用索引,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须单独使用时能使用索引.
4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起 来。否则不使用索引。 expain select * from dept where dname=’111’; expain select * from dept where dname=111;(数值自动转字符串) expain select * from dept where dname=qqq;报错 也就是,如果列是字符串类型,无论是不是字符串数字就一定要 用 ‘’ 把它包括起来. 5. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。 表里面只有一条记录