MYSQL八股
侧边栏壁纸
  • 累计撰写 38 篇文章
  • 累计收到 12 条评论

MYSQL八股

admin
2024-05-14 / 0 评论 / 54 阅读 / 正在检测是否收录...

VARCHAR(100)和VARCHAR(10)的区别是什么?
二者在磁盘中占的大小是相同的,但是100能存储的数据更多,如果10想存储更多,需要改变结构
在内存中100占用更多,因为要分配固定大小的内存来存储

为什么不推荐使用 TEXT 和 BLOB?
● 检索性差
● 不能有默认值
● 不能直接创建索引,需要指定前缀长度
● 消耗大量网络和IO
● 在使用临表时不能使用内存临表,只能创建硬盘临表

DATETIME 和 TIMESTAMP 的区别是什么?
DATETIME大小为5-8字节,根据是否有毫秒表示
DATETIME无时区,表示范围1000-9999
TIMESTAMP4-7字节
有时区,范围1970-2038

NULL 和 '' 的区别是什么?
● NULL在一定条件下是不等的select null=null结果为false,但是在dictinct group by又是相等的
● null要占大小,''不需要占大小
● null存在字段中的时候,使用count(字段)是会排除null的,只计算非null
● 比较时要用is null 比较 ''可以直接比较

为什么 MySQL 不建议使用 NULL 作为列默认值?
在对某个字段进行计数的时候,会因为null,而无法正确的计数
还会因为null占大小,造成不必要的磁盘开销

MSQL的存储引擎了解吗?
● MYSQL存储引擎是插件式架构,且是基于表的,可以为不同的表设置不同的存储引擎,也可以按MYSQL提供的标准自定义存储引擎

MyISAM 和 InnoDB 有什么区别?
● InnoDB支持行级锁,MyISAM不支持行级锁,只支持表级锁,锁竞争更激烈
● InnoDB支持事务,MyISAM不支持事务,InnoDB提供了四种事务级别(读未提交,读已提交,可重复读,可串行化)
● InnoDB支持外键
● InnoDB支持通过redo log崩溃后安全恢复
● InnoDB支持MVCC
● InnoDB和MyISAM都是采用B+树,但是实现方式不同
● InnoDB性能更高

缓存不命中的情况?
● 当两个查询语句的字符串不完全一样时不会命中
● 当使用聚合函数时不会命中
● 当缓存建立后,会根据缓存内容的表是否发生改变,决定缓存是否失效

MYSQL有哪些日志?
● Error log用来储存mysql启动、关闭过程的日志记录
● binary log用来存储对数据库的操作日志
● 一般查询日志:已建立连接的客户端发送给mysql的所有查询语句,一般没开
● slow_query_log 慢查询日志,可通过慢查询日志解决sql执行慢
● redo undo log redo log 是重做日志,undo是回滚日志
● relay-log 和binary log 差不多但是relaylog主要是从库
● DDL日志,ddl语句执行的元素据操作

binary log
● 一般对数据库的数据有改变的会被记录到binarylog中,select show这些不会
● 即使表结构数据修改操作并未对数据库修改也会被记录
● 类型一般有
○ statement:每一条修改的sql都会被记录,insert update delete
○ row:每一行的变更都会记录
○ Mixed混合模式:默认使用statement,在有些场景使用row
● statement性能更好,磁盘压力小,日志文件小,但是准确性差点
● 主要用于主从复制、主主、主备
● 刷盘时机:sync_binlog
○ 0 系统决定什么时候刷盘
○ 1 每一次事务完成都刷
○ N N个完成之后刷盘
● 什么时候重写binlog文件序号递增
○ mysql重启
○ 日志文件大小超过阈值
○ fulsh logs命令后

Mysql如何保证持久性
innoDB插入的数据都是存在于页中的,为了减少io读取内存中存在buffer poll缓存池,在查询时buffer poll中不存在时,直接读取到buffer pool来直接操作页,当完成操作之后,提交事务时遇到mysql宕机,事务更改失败,违背持久性,引入redolog,记录空间号,页号,偏移量,更新的数据,在提交事务的时候,直接将redo log刷到磁盘上

undo log原子性
当事务执行失败,可通过undo log进行回滚操作
undo log是逻辑日志,insert时会自动生成记录一条delete

事务
● 事务可以看作成一组操作,要么都成功,要么都失败
● ACID 原子性、一致性、隔离性、持久性

脏读
当事务1更改数据之后,事务二读取,但是事务1又回滚了,出现脏读

脏写
当事务1写入之后,事务2又写入,事务1回滚

不可重复读
事务1在执行读取,事务2对数据进行了操作,导致读出的数据不同

幻读
事务1读取几行数据,事务2又插入了几条数据,导致事务1幻读

四个隔离
● read-uncommit 读未提交 脏读、幻读、不可重复读
● read-commit 读已提交 幻读、不可重复读
● preatable-read可重复读 幻读
● serializable 可串行化

0

评论 (0)

取消