MySql的一些面试题

MySql的一些面试题

MySql中的锁

按锁颗粒度分

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

还可以分为:

  • 乐观锁:并不会真正的去锁某行数据,但是通过判断版本号来实现
  • 悲观锁:行锁,表锁等都是悲观锁

按还可以分为:

  • 共享锁:也就是读锁----一个事务给某行数据加了读锁,其他事务也可以加读锁,但是不能加写锁
  • 排它锁:也就是写锁—一个事务给某行数据加了写锁,其他事务不能加读锁,也不能加写锁

mysql加锁:

  1. 显示加锁
    SELECT … FOR UPDATE 手动加排它锁
    SELECT … LOCK IN SHARE MODE 手动加共享锁
  2. 隐示加锁
    隐示加锁,自动加锁,不需要手动指定。根据事务隔离级别不同,而展现的不同。
    读未提交、提交读、串行:只有行锁。
    可重复读:有行锁、间隙锁、Next-Key 锁,可重复读也就是通过间隙锁、Next-Key 锁来防止幻读的。

MySql中的MyISAM 和INNODB

  • InnoDB支持事务,MyISAM不支持事务
  • InnoDB支持外键,MyISAM不支持外键
  • InnoDB 支持 MVCC(多版本并发控制),MyISAM 不支持
  • select count(*) from
    table时,MyISAM更快,因为它有一个变量保存了整个表的总行数,可以直接读取,InnoDB就需要全表扫描。
  • Innodb不支持全文索引,而MyISAM支持全文索引(5.7以后的InnoDB也支持全文索引)
  • InnoDB支持表、行级锁,而MyISAM支持表级锁。
  • InnoDB表必须有主键,而MyISAM可以没有主键
  • Innodb表需要更多的内存和存储,而MyISAM可被压缩,存储空间较小。
  • Innodb按主键大小有序插入,MyISAM记录插入顺序是,按记录插入顺序保存。
  • InnoDB 存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全,与 MyISAM 比 InnoDB写的效率差一些,并且会占用更多的磁盘空间以保留数据和索引
  • InnoDB 属于索引组织表,使用共享表空间和多表空间储存数据。MyISAM用.frm、.MYD、.MTI来储存表定义,数据和索引。

Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?

SQL标准定义的四个隔离级别为:
read uncommited :读到未提交数据
read committed:脏读,不可重复读
repeatable read:可重读
serializable :串行事物

CHAR和VARCHAR的区别

  • CHAR和VARCHAR类型在存储和检索方面有所不同

  • CHAR列长度固定为创建表时声明的长度,长度值范围是1到255
    当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。

解释MySQL外连接、内连接与自连接的区别

  • 先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
  • 内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
  • 外连接其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
  • 左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。
  • 右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。

主键外键索引的区别

定义:

  • 主键–唯一标识一条记录,不能有重复的,不允许为空
  • 外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值
  • 索引–该字段没有重复值,但可以有一个空值

作用:

  • 主键–用来保证数据完整性
  • 外键–用来和其他表建立联系用的
  • 索引–是提高查询排序的速度

个数:

  • 主键–主键只能有一个
  • 外键–一个表可以有多个外键
  • 索引–一个表可以有多个唯一索引

索引的类型

  • 主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
  • 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
  • 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
  • 全文索引:是目前搜索引擎使用的一种关键技术,对文本的内容进行分词、搜索。
  • 组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并
  • 覆盖索引:查询列要被所建的索引覆盖,不必读取数据行

三大范式

  • 第一范式:数据表中的每一列(每个字段)都不可以再拆分
  • 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
  • 第三范式:在满足第二范式的基础上,表中的非主键只依赖于主键,而不依赖于其他非主键。

最左前缀原则:
当一个SQL想要利用索引时,就一定要提供索引对应的字段中最左边的字段,也就是排在最前面的字段,比如针对a,b,c三个字段建立的一个联合索引,那么在写一个SQL时就一定要提供a字段的条件,那么才能用到联合索引;

索引失效场景:

  • 使用复合索引但是违反最左前缀原则
  • where中对字段进项null(is null 和 is not null)的判断
  • where中使用 != 或者 <> 操作符
  • 对索引使用mysql函数,计算表达式,列运算等;
  • 模糊查询like,%放在前面(‘%aaa’)
  • where语句中使用or连接条件,如果一个字段有索引一个字段没有索引,则会导致引擎放弃使用索引而进行全表扫描
  • 字符串要加引号,否则索引会失效(涉及隐式转换 )

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值