JAVA面试题-Mysql数据库

1.分别介绍一下innodb和myisam?

  1. MyIASM 是 MySQL 默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键, 因此当INSERT(插入)或 UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。ISAM 执行读取操作的速度很快,而且不占用大量的内存和存储资源。
  2. InnoDB 底层存储结构为 B+树, B 树的每个节点对应 innodb 的一个 page,page 大小是固定的, 一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。通常如果对数据进场进行增删改的时候推荐使用innodb。

2.innodb的数据结构

innodb的数据结构其实是b+树,主要跟b树的区别在于在叶子节点多了横向的指针,这样可以更加简单地去遍历数据。

3.Innodb和myisam的对比?

  1. innodb支持事务,myisam不支持事务。
  2. innodb支持外键,myisam不支持外键。
  3. myisam只支持表级锁,innodb他的锁粒度更加精细,支持行级锁,但是如果innodb在进行扫描时候不确定sql的范围,使用的也是表级锁。
  4. 执行大量的查询语句的时候myisam执行效率更好,执行大量的增加删除语句最好用innodb。

4.事务的概念?ACID的特征分别介绍一下?数据库的隔离级别?

  1. 事务(TRANSACTION)表示一个完整的不可分割的业务,批量的 DML 语句同时成功或者同时失败.原子性不可再分

    最基本单元,可以看做一个完整的事件,通常一个事务可以对应一个完整的业务流程。

  2. 原子性(Atomicity) 整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。

    一致性(Consistency) 在事务开始之前与结束之后,数据库都保持一致状态。

    隔离性(Isolation)一个事务不会影响其他事务的运行。

    持久性(Durability) 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。

  3. 读未提交(READ UMCOMMITTED)允许一个事务可以看到其他事务未提交的修改。

    读已提交(READ COMMITTED)允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。他是sql Server,orical等数据库默认级别。

    可重复读(REPEATABLE READ)确保如果在一个事务中执行两次相同的 SELECT 语句,都能得到相同的结果,不管其他事务是否提交这些修改。他是mysql默认的隔离级别。

    串行化(SERIALIZABLE)该隔离级别为 InnoDB 的缺省设置。将一个事务与其他事务完全地隔离。

5.数据库的三大范式?

数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

  1. 有主键,具有原子性,字段不可分割。就是所有字段值都是不可分解的原子值,比如说数据库我们经常用到地址这个字段就直接使用即可,但是如果需要用到省份、城市、我们就需要拆开,把省份、城市单独设为一列。
  2. 确保表中的每列都和主键相关,表中非主键列不存在对主键的部分依赖。要求每个表只描述一 件事情。比如说一个订单有多个商品,我们需要把订单表和商品表拆分,通过一个中间表来进行连接表示。
  3. 确保每列都和主键列直接相关,而不是间接相关。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。

6.数据库怎么读写分离?怎么拆分表的?

  1. 首先主服务器的master数据库记录数据库的操作日志到binlog,然后从服务器开启io线程将同步binlog的操作日志记录到从服务器的relaylog里面(就是从服务器的缓存中),最后从服务器启动sql线程把relaylog里面的操作sql在从库进行执行,这样实现读写分离。
  2. 表的拆分有两种,垂直拆分和水平拆分
    1. 垂直拆分:垂直拆分是根据字段将表进行拆分(比如说订单表有价格和库存两个字段,把 库存单独存一个表,把库存单独存一个表拆分开来)
    2. 水平拆分:水平拆分就是按照表的字段的某些规则进行匹配拆分(比如说按照表的ID来进行拆分,id为1-1000的为一个表,1001-2000为第二个表这样拆分)

7.查询语句的优化?

  1. 避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符;
  2. 合理使用EXISTS,NOT EXISTS子句;
  3. 能够用BETWEEN的就不要用IN;
  4. 能够用DISTINCT的就不用GROUP BY;
  5. 程序中如果一次性对同一个表插入多条数据,把它拼成一条语句执行效率会更高;

8.索引是什么?

索引其实是对数据库的列的内容进行排序的结构,它有点像我们字典的定位页码的拼音或者笔画,可以帮助我们快速获取数据库的内容,是一种数据结构。

9.索引的优点和缺点?

  1. 优点:

    大大加快数据的检索速度;

    创建唯一性索引,保证数据库表中每一行数据的唯一性;

    加速表和表之间的连接;

    在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;

  2. 缺点:

    创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;

    索引需要占物理空间;

    当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度;

10.索引在什么情况下使用?在什么情况下不使用?

  1. 使用情况:

    主键列中创建索引;

    多表连接时连接列创建索引;

    where子句查询的列;

    需要经常GROUP BY和ORDER BY的列;

  2. 不使用情况:

    对数据有大量重复值的数据不使用索引(比如说性别,通常使用0 1);

    表中的数据内容较少不使用索引;

    需要频繁更新的字段不推荐使用索引;

11.索引失效的情况?

  1. like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效;
  2. or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效;
  3. 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描;
  4. 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0;

12.索引的优化策略?

  1. 最左前缀匹配原则;
  2. 主键外检一定要建索引;
  3. 对 where,group by,order by 中出现的列使用索引;
  4. 不要过多创建索引, 权衡索引个数与DML之间关系,DML也就是插入、删除数据操作。这里需要权衡一个问题,建立索引的目的是为了提高查询效率的,但建立的索引过多,会影响插入、删除数据的速度;

13.左连接,右连接,内连接的区别?分别在什么情况下使用?

  1. 使用左连接的话,以左边为主表,右边为从表,当右表没有符合的数据则会显示为null;
  2. 使用右连接的话,以右边为主表,左边为从表,当左表没有符合的数据则会显示为null;
  3. 内连接也算是对他们两者的一个结合,只会显示左右表都符合的数据;
  4. 使用情况总结就是:是否要全部展示,什么数据需要全部展示,是否要展示符合条件的数据;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值