MySQL面试常考基础题

内容并不详细,但都是高频考察点,每个不熟悉的地方都应自行寻找拓展资料。

主要内容:

  • 事务的原理,特性,并发控制
  • 常用字段类型的含义与区别
  • 常用数据库引擎之间的区别

1 事务的原理,特性,并发控制

事务(Transaction):

  • 事务是数据库并发控制的基本单位
  • 事务可以看作一系列SQL语句的集合
  • 事务必须要么全部执行成功,要么全部执行失败(回滚)

例如转账操作,一方加,一方减,这两个操作必须为一个整体。

下面是Python的一个ORM框架的实现,可以体现出的事务中操作的整体性:

session.begin()
try:
	item1 = session.query(Item).get(1)
	item2 = session.query(Item).get(2)
	item1.foo = 'bar'
	item2.bar = 'foo'
	session.commit()
except:
	session.rollback()
	raise

事务的ACID特性:

  • 原子性(Atomicity),一个事务中全部操作同时成功,或同时失败
  • 一致性(Consistency),事务结束后数据完整性不被破坏
  • 隔离性(Isolation),允许多个事务同时对数据库进行读写与修改
  • 持久性(Durability),事务结束后,修改是永久的,不会丢失

不进行并发控制会出现异常:

  • 幻读(phantom read),一个事务第二次查,出现第一次没有的结果
  • 非重复读(noreaptable read),一个事务读两次,得到不同结果
  • 脏读(dirty read),一个事务读到另一个事务没有提交的事务
  • 丢失修改(lost update),并发写入导致其中一些修改丢失

四种事务隔离级别:

  • 读未提交(read uncommitted),别的事务可以读取到未提交改变
  • 读已提交(read committed),只能读取已提交的事务
  • 可重复度(repeatable read),同一事务先后查询结果一样,是MySQL InnoDB的默认级别
  • 串行化(Serializable),事务完全串行执行

隔离级别越高,执行效率越低。

如何解决高并发场景下的插入重复问题:

  • 使用数据库的唯一索引,则重复插入时,数据库层面会抛出异常
  • 使用队列进行异步写入
  • 使用redis实现分布式锁

并发控制就是在事务进行写入时加锁(包括行锁和列锁)

悲观锁和乐观锁:

  • 悲观锁先获取锁,再进行操作(一锁二查三更新,select for update,操作前就认为有别的事务也要更新它)
  • 乐观锁先执行修改,更新时发现数据变了就回滚(check and set,通过版本号、时间戳实现)
  • 需要根据响应速度、冲突频率和重试代价综合起来选择合适的锁

2 常用字段类型的含义与区别

字符串类型(文本):

MySQL常用数据类型-字符串(文本)
类型 占用空间 长度范围
CHAR[Length] Length (bytes) 定长串,0-255
VARCHAR[Length] String Length + 1 or 2 (bytes) 变长串,0-65535
TEXT String Length + 2 (bytes) 文本,最大65535

数值类型:

MySQL常用数据类型-数值
类型 占用空间
TINYINT[Length] 1 byte
SMALLINT[Length] 2 bytes
MEDIUMINT[Length] 3 bytes
INT[Length]

4 bytes

BIGINT[Length] 8 bytes
FLOAT[Length,Decimal] 4 bytes
DOUBLE[Length, Decimal] 8 bytes

Length代表数据库中显示的字符宽,与占用空间的大小,所能表示的范围无关。

日期类型:

MySQL常用数据类型-日期
类型 占用空间 格式
DATE 3 bytes YYYY-MM-DD
DATETIME 8 bytes YYYY-MM-DD HH:MM:SS
TIMESTAMP 4 bytes YYYYMMDDHHMMSS

TIMESTAMP类型可表示范围为[1970, 2038]。

3 常用数据库引擎之间的区别

两种常用引擎InnoDB和MyISAM的区别:

  • InnoDB支持事务,外键;而MyISAM不支持
  • InnoDB支持行锁和表锁;而MyISAM只支持表锁
  • InnoDB不支持全文索引;而MyISAM支持
  • 二者在聚集索引与非聚集索引上存在差异

聚集索引与非聚集索引:

  • 聚集与非聚集指的是B+树的叶节点存的是数据记录还是指针(聚集——数据记录,非聚集——指针)
  • MyISAM索引和数据分离,均为非聚集索引,需要两个文件进行存储(.MYD文件和.MYI文件)
  • InnoDB的数据文件就是索引文件,主键索引是聚集索引,所以叶节点既有索引,又有具体数据内容(文件后缀.ibd)
  • InnoDB的其他索引(辅助索引),叶节点存的是主键值,再通过主键进行索引(所以辅助索引要慢)
发布了110 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/liujh_990807/article/details/104064984