java面试准备17

事务的四大特性

(1)原子性:事务执行的最小单位,不可被分割,事务的原子性保证事务中的一连串动作要么都执行,要么都不执行。
(2)一致性:执行事务前后的数据保持一致,多个事务对同一个数据的读取结果是一样的。
(3)隔离性:并发访问数据库时,一个事务不会被其他事务所干扰,各个并发事务之间是独立的。
(4)持久性:一个事务提交之后,它对数据库的改变是持久的,即使数据库发生故障也不会有任何影响。

什么是脏读、幻读、不可重复读

脏读:某个事务已经更新了一份数据,另一个事务在此期间读取了这个数据,由于某些原因,前一个事务执行了回滚操作,则此时后一个事务读取的数据是不正确的。
不可重复读:同一个事务两次查询之间数据不一致,这可能是两次查询之中插入了一个事务更新了原有的数据。
幻读:同一个事务两次查询到的数据数目不一致,两次查询间有另一个事务插入或者删除了几条数据。

数据库的四种隔离级别

读取未提交:最低的隔离级别,允许读取尚未提交的数据变更,会导致脏读(读取到回滚数据)、不可重复读(两次读取间有更新)、幻读(两次读取间有新增或者删除)。
读取已提交:允许读取并发事务已经提交的数据,可以防止脏读。
可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务所修改,可以阻止脏读和不可重复读。
可串行化:最高的隔离级别,所有事务依次执行,这样事务之间完全不会被干扰。

隔离级别和锁的关系

(1)在读未提交的级别下,读取数据不需要加共享锁。
(2)在读已提交的级别下,读取数据需要增加共享锁,但会在语句执行完后释放共享锁。
(3)在重复读的隔离级别下,读操作需要加共享锁,但在事务提交不会释放共享锁,也就是必须等待事务执行完毕后才可以释放共享锁。
(4)在序列化的级别下,该级别锁住整个表的数据,并且一直持有锁,知道事务完成。

从锁的类别上区分,MySql都有哪些锁

共享锁:又叫做读锁,当用户需要进行数据的读取时,对数据加上共享锁,共享锁可以同时加上多个。
排他锁:又叫做写锁,当用户需要进行数据的写入时,对数据加上排他锁,排他锁只可以加一个,它和其他的排他锁、共享锁都互斥。

SQL约束有哪几种

Not Null:用于控制字段的内容一定不能为空(NULL)
UNIQUE:控制字段不能重复,一个表允许有多个UNIQUE约束
PRIMARY KEY:用于控制字段不能重复,不能为空,且一个表中只能有一个
FOREIGN KEY:用于预防破坏表之间的连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值。

varchar和char的区别

char:char表示长字符串,长度是固定的,如果插入数据的长度小于char的固定长度时,则会用空格填充,因为长度固定,所以char的存取速度比varchar要快很多,甚至可以快50%,但是因为其长度固定,所以会占据很多多余的空间,是空间换时间的做法。
varchar:表示可变长字符串,长度是可变的;插入的数据多长,就按照多长来存储,存取方面比char慢,因为长度不确定,但因此不占用多余空间,是时间换空间的做法。

FLOAT和DOUBLE的区别是什么?

Float类型数据最多存储8位十进制数,并且在内存中占有4字节。
Double类型数据最多存储18位十进制数,并且在内存中占8字节。

drop、delete和truncate

delete:可回滚,删除后表结构还在,可以删除表的全部或者一部分数据,删除速度慢,需要逐行删除。
trancate:不可回滚,表结构还在,删除表中的所有数据,删除速度快
drop:不可回滚,从数据库中删除表,所有的数据行,索引和权限也会被删除,删除速度快。

UNION与UNIONALL的区别

如果使用UNION ALL,不会合并重复的记录行
UNION效率高于UNION ALL

SQL的生命周期

(1)应用服务器与数据库服务器建立一个连接
(2)数据库进程拿到请求sql
(3)解析并生成执行计划,执行
(4)读取数据到内存中并且进行逻辑处理
(5)经过步骤一的连接,发送结果到客户端
(6)关掉连接,释放资源

优化查询过程中的数据访问

访问数据太多导致查询性能下降,确定应用程序是否在检索大量超过需要的数据,可能是太多行或者列,确认MySQL服务器是否在分析大量不必要的数据行,避免犯如下SQL语句错误:
(1)查询不需要的数据,解决办法:使用limit解决
(2)多表关联返回全部列,解决办法:指定列名
(3)总是返回全部列,解决办法:避免使用select * 重复查询相同的数据。解决办法:可以缓存数据,下次直接读取缓存。
(4)是否存在扫描额外的记录,解决办法:使用explain进行分析,如果发现查询需要扫描大量的数据,但只返回少数的行,可以通过如下技巧去优化:
使用索引覆盖扫描,把所有的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果。

某个表有近千万数据,CRUD比较慢,如何优化?

(1)限定数据的范围:务必禁止不带任何限制数据范围条件的查询语句。
比如在查用户订单历史的时候,可以控制在一个月的范围内。
(2)读/写分离:经典的数据库拆分方案,主库负责写,从库负责读。
(3)缓存:使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存。

你可能感兴趣的:(java,面试,数据库)