关于数据库(mybatis)基础面试题整理

1.事务的基本特征

原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。

隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。

持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

2.事务的隔离级别,mysql默认的隔离级别是什么?

读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证。

读已提交(Read committed),一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生。

可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生。

串行(Serializable),是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。Mysql的默认隔离级别是Repeatable read。

3.说一说脏读、不可重复读、幻读

脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据;

不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致;

幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性);

4、MySQL主要的索引类型

普通索引:是最基本的索引,它没有任何限制;

唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;

主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;

组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;最左原则

全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持(5.6之后的mysql中,InnoDB引擎也支持全文索引);

5.数据库三大范式

第一范式:数据库表中的字段都是单一属性的,不可再分(保持数据的原子性);

第二范式:第二范式必须符合第一范式,非主属性必须完全依赖于主键。

第三范式:在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关(表中字段[非主键]不存在对主键的传递依赖)

6.sql语句分类:

DDl,DML,DQL,DCL

7.索引的作用?和它的优点缺点是什么?

提高查询效率,

优点: 查询效率高, 降低数据IO成本, 降低数据排序CPU消耗

缺点: 占用磁盘空间, 新增,删除, 修改----> 慢, 因为需要修改索引

8.说几个mysql中你常用的函数

limit、order by、between、group by;

9. 使用like ‘a%’ 、like’%a’、like’%a%'查询时是否会使用索引

'a%'会,其他两个不会

mysql 优化面试题

为什么要优化 ?

​ 在少量数据的情况下,一般不会涉及到性能问题,当我们数据量变多,达到几百万上千万时候,会明显感觉到一些复杂查询执行效率缓慢,一条sql可能需要执行好几秒,为了用户体验的良好以及系统运行的流畅,我们需要进行sql优化,使我们的程序执行更快

优化由谁参与

​ 在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人员、硬件及系统管理员、存储管理员等,业务相关人员共同参与。

优化选择

  1. 优化成本: 硬件>系统配置>数据库表结构>SQL及索引

  2. 优化效果: 硬件<系统配置<数据库表结构<sql及索引

sql语句优化

  1. 避免使用 select * , 因为在执行过程中, 首先要把 解析成字段,然后进行查询, 影响效率*

  2. 尽量避免在where 子句中使用 != 或 <> 操作符, 否则将导致mysql放弃使用索引, 而进行全表扫描

    如:

    select id from t where num !=null;

  3. 下面的查询也将导致全表扫描:

    select id from t where name like ‘%abc%’

    select id from t where name like ‘%abc’

    使用 select id from t where name like ‘abc%’ 索引不会失效

  4. 尽量避免在 where 子句中对字段进行 null 值判断, 否则将有可能导致mysql放弃使用索引, 而进行全表扫描

    如:

    select id from t where num is not null

    可以在num 上设置默认值0, 确保表中num列没有null 出现, 然后查询语句可以这样写

    select id from t where num=0;

  5. 尽量避免在 where子句中使用 or 来连接条件, 否则将有可能导致mysql放弃使用索引, 而进行全表扫描

    如:

    select id from t where num=10 or num=20

    可以这样写

    select id from t where num=10

    union all

    select id from t where num=20

  6. in 和 not in 也要慎用, 否则有可能会导致全表扫描

    select id from t where num in(1,2,3)

    对于连续的数值, 我们能用between 就不需要使用 in 了

    select id from t where num between 1 and 3

  7. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

    这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

    比如: sex 0, 1

  8. 尽可能的使用 char 代替 varchar ,因为首先变长字段存储空间小,可以节省存储空间,

    其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

    Char:定长,效率高,一般用于固定长度的表单提交数据存储 ;例如:身份证号,手机号,电话,密码等

    varchar:不定长,效率偏低,节约空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值