作为一位JAVA工程师,不论你是初级程序员,还是中级程序员,高级程序员,MYSQL面试题是一定会问的,这个是考验你对数据库了解的深度和广度。
在我们平时面试过程中,那些mysql面试题是经常被问到的呢?你有哪些问题是不会的呢?趁热打铁赶紧巩固一下mysql的知识吧
1.mysql事务的基本特征和事务隔离级别
四大特性:原子性,一致性,隔离性,持久性;隔离级别:读未提交,不可以重复读,可重复读,串行化。
面试题2.说一说mysql脏读、不可重复读、幻读
脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据;不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致;幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态。
3.mysql数据表类型有哪些?
MyIASM、InnoDB、HEAP、ISAM、MERGE、DBD(能回复前2个即可)
4.mysql的MyIASM和InnoDB引擎,各有什么特点?
MyIASM:不支持事务,表锁,读写互相阻塞,只会缓存索引;
InnoDB:支持事务,行锁,读写阻塞与事务隔离级别相关,不仅缓存索引还缓存数据
5.数据库三大范式
第一范式:数据库表中的字段都是单一属性的,不可再分(保持数据的原子性);第二范式:第二范式必须符合第一范式,非主属性必须完全依赖于主键。第三范式:在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关(表中字段[非主键]不存在对主键的传递依赖)
6.你对sql的优化了解有多少,举例说明一下,至少5个
查询不要使用select*;使用连接(join)查询代替子查询;用exists代替in;尽量避免在where子句中使用or来连接条件;ORDERBY+LIMIT组合的索引优化;模糊查询%name%改成”name%“。避免全表扫。还有很多。。。。
7.除了CRUD的关键字,你还会使用哪些MYSQL关键字?
show,explain,distinct,betweenand,limit,orderby
8.你对索引了解多少,它有什么作用,并且优缺点有哪些?
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索;索引对于查询比较快,索引对于增删改会比较慢
9.你是怎么样设计索引的?使用索引有哪些注意的事项?
索引应该建在选择性高的字段上(键值唯一的记录数/总记录条数),选择性越高索引的效果越好、价值越大,唯一索引的选择性最高;组合索引中字段的顺序,选择性越高的字段排在最前面;where条件中包含两个选择性高的字段时,可以考虑分别创建索引,引擎会同时使用两个索引(在OR条件下,应该说必须分开建索引);不要重复创建彼此有包含关系的索引,如index1(a,b,c)、index2(a,b)、index3(a);组合索引的字段不要过多,如果超过4个字段,一般需要考虑拆分成多个单列索引或更为简单的组合索引设计所以的字段的值不能是NULL,否则索引失效
数据库10.你有对mysql表分区有了解多少?有多少种分区类型,说一下他们的特点
Range分区,基于一个给定连续区间范围,把数据分配不同的分区
List分区,类似Range分区,区别是List分区是基于枚举出的值列表分区,Range分区是基于给定的连续区间范围分区
Hash分区,基于给定的区间个数,把数据分配到不同的分区
Key分区,类似Hash分区