db
1.MySQL是什么?
MySQL是一个开源的关系型数据库管理系统
2.什么是关系型数据库?
关系型数据库就是一种建立在关系模型基础上的数据库,关系模型表达了数据库所存储数据之间的联系
在关系型数据库中我们的数据都存储在表中,表中的每一行都代表一个数据
关系型数据库可以使用SQL语言来操作
3.什么是SQL?
SQL(是一种结构化查询语言)就是一种操作数据库的语言
4.MySQL有什么优点
1.开源免费
2.庞大的社区 生态完善
3.开箱就用 容易上手
4.维护成本低
5.优秀的性能
6.支持事务
5.MySQL的字段?
数值型:TINYINT、SMALLINT、MENDIUMINT、INT、BIGINT
字符型:CHAR、VARCHAR、TINYTEXT、TEXT 等
日期时间型:YEAR、TIME、DATE、DATETIME 等
6.整数类型的UNSIGNED有什么用
UNSIGNED是无符号的意思,带有UNSIGNED的整数是无符号整数的意思
就是非负的,并且原来存储正的数值范围会扩大一倍
7.CHAR和VARCHAR的区别
1. CHAR是定长字符(快但是浪费) 而 VAHRCHAR是可变字符(省空间但是慢)
2.CHAR会再存储时在右边填充空格 检索时去掉空格,VARCHAR会单独留1-2字节记录字 符串长度 也就是会保留空格
VARCHAR(10)和 VARCHAR(100)有什么区别?
VARCHAR(100) 和 VARCHAR(10)都是代表存储的字符个数不同 分别最多存100个和10个
但是他们存相同字符串时 所占用的空间是一样的
VARCHAR的变长是磁盘空间的 而是根据内存来的 因此VARCHAR(100)要比VARCHAR(10)更多内存
8.DECIMAL和FLOAT/DOUBLE的区别
DECIMAL是定点数 直接存储数字的每一位
FLOAT和DOUBLE是浮动的 使用二进制科学计数法
DECLAML适用于对精准特别要求的地方 金额等
FLOAT、DOUBLE适用于不那么精准的 距离温度等
9.为什么不推荐使用TEXT和BLOB?
TEXT存储更长的字符 BLOB存储视频音频图片等
1. 这是因为TEXT和BLOB会发生溢出 把数据放到溢出页 需要更多的IO
2. 不能直接使用索引
3. 也不能使用INNODEB的缓存池 只能缓存其指针 需要二次读取
总结:造成溢出到溢出页多余IO 不能缓存索引 影响性能
10.DATATIME和TIMESTAMP的区别如何选择?
Datatime是不带时区信息的 TimeStamp是带时区信息的
DataTime是8个字节 TimeStamp是4个字节
选择:
当使用时区相关的时候 时区转换的时候使用TimeStamp 但是只能存1970-2038年
其他时候使用DataTime 能存1000-9999
11.NULL和‘’区别?
NULL和’’是两个完全不同的值
null表示一个不确定的值 使用= != <>等关系运算符的时候是得出来的都是null
‘’是一个字符 是一个实际存在的值 使用关系运算符是有值的
null需要一些存储空间来专门存储 ’’只需要一点空间来存储
在使用聚合函数的时候不能用null 会忽略null
12.Boolean类型如何表示
使用TINYINT 只有一个字节 可以使用01表示true false
13.手机号存储INT还是VARCHAR
使用VARCHAR
1.手机号是标识符 不需要参与运算
2.手机号一般会有前缀+ -
3.对于模糊查询很方便使用VARCHAR
4.手机号会进行加密 有的有字符有的很长长度 因此用VARCHAR更好
14.MySQL基本架构?
MySQL的基本结构分为 连接器 缓存 分析器 优化器 执行器 插件式缓存引擎
当执行select时会发生什么?
1.会使用连接器建立连接 其中先tcp三次握手建立网络连接 然后对密码等进行校验 缓存用户的权限 有链接复用连接池
2.会使用当前查询语句查询缓存(8.0后已经没有query cache了 不会执行这一步)
3.使用分析器器解析 词法分析识别关键字 然后语法分析是否符合SQL语法
4.优化器选择性能较优的执行
5.执行器执行 先检验用户对目标的权限 调用存储引擎接口(缓存有直接用 没有从磁盘读取)
当断开连接时会tcp四次挥手断开连接
15.MySQL存储引擎架构?
MySQL的存储引擎是插件式的存储引擎 它是基于每个表的不是基于数据库的
16.MySQL存储引擎有哪些?
InnoDB(5.5.5后默认)、MyISAM(5.5.5前默认)、Memory、Archive、CSV、Blackhole、Federated
17.MyISAM和InnoDB有什么区别?
1.在5.5.5版本之前MyISAM是默认的在5.5.5版本之后InnoDB是默认的
2. InnoDB 是支持事务的
3. InnoDB 是支持行级锁的 MyISAM只支持表锁
4. InnoDB 支持MVCC
5. InnoDB 支持异常错误恢复
6.性能上InnoDB更好 即使是在单核的时候 会随着核数增加增加
7.InnoDB支持外键 但是不应该使用外键 使用约束
8.缓存上 InnoDB是有缓冲池的 缓存数据和索引页 MyISAM是使用的键缓存 只缓存索引页
18.MySQL索引?
索引是一种数据结构 是一种快速查询和检索数据的数据结构 是一种一种已经排好序的数据结构
19.索引的优点?
1.索引的速度特别快 大幅度减少磁盘io的次数 底层使用B+胖矮的结构
2.加速分组和排序 可以直接使用索引 因为是已经排好序的
3.保证数据的一致性 使用unique index保证数据的一致性
20.索引的缺点
1.索引会失效或者错用 当使穿件索引时不好的查询、索引设计不好就会造成
2.索引是一个真实存在的文件 会占用磁盘空间
3.索引的创建和维护耗时 当一个很大的表时会很耗时创建 更新数据库表的时候 还要更新索引 因此很耗时
21.索引一定会提高性能吗(索引什么时候会失效)
1.当数据量太小 优化器会觉得不是最佳选择 会全表扫描
2.当查询的数据战20-30%以上 优化器会用全表扫描
3.索引维护不当 信息过时
22.索引为什么那么快?
1.因为是使用了B+树数据结构 这种树胖矮层数少减少了io次数 数据都在叶子结点 非叶子结点都是索引信息
2.叶子结点是通过链表串联起来的 能顺着顺序读下去 对磁盘很友好 还能触发预读
23.为什么InnoDB没有使用哈希作为数据结构?
1.哈希虽然查询是O(n) 但是不支持范围查询 使用B+树会可以更加叶子结点的链表查询对应的范围 但是使用哈希表 因为在hash的过程中就会隐藏掉数据的特征因此需要一个一个的查询
2.不支持部分查询 当使用联合索引的时候 只查一部分是做不到的
3.容易发生hash冲突 会形成链表会退化为O(n)
4.不支持排序 hash表是无序的 不能用来优化排序
24.为什么没有使用B树?
1.B树和B+树的区别?
B树是一种索引和数据混合的数据结构 不同于B+树就是 B+树是叶子结点存数据 非叶子节点存索引 叶子结点有链表串联
2.为什么没有使用B树?
1.查询稳定性好 B树的数据分布不规律 Io次数大有不同 稳定性差 B+树需要遍历到叶子结点 同级速度一致因此稳定性好
2.范围查询更优好 B树要回溯 依次查询 B+树直接遍历叶子结点链表
3. IO效率更高 树形上B+树胖矮 B+树是叶子结点存数据 非叶子节点存索引
25.什么是覆盖索引
就是查询需要的所有字段 都能从同一个索引中直接获取,无需通过主键回表查询聚簇索引的整行数据。
26.什么是回表
就是在查询的时候 查询的字段没有创建索引 因此只能去表中搜索
26.MySQl的联合索引和最左前缀原则
联合索引就是使用多个字段创建索引
最左前缀原则有个联合索引 并且查询到时候设计到了联合索引 联合索引的使用的法则
1.从左向右 不能跳过某个索引字段 否则不能用当前字段的索引
2.查询条件 or 连接的时候 前后都必须有
常见的面试题:如果有索引 联合索引(a,b,c),查询 a=1 AND c=1 会走索引么?c=1 呢?b=1 AND c=1 呢? b = 1 AND a = 1 AND c = 1 呢?
- 查询
a=1 AND c=1:根据最左前缀匹配原则,查询可以使用索引的前缀部分。因此,该查询仅在a=1上使用索引,然后对结果进行c=1的过滤。 - 查询
c=1:由于查询中不包含最左列a,根据最左前缀匹配原则,整个索引都无法被使用。 - 查询
b=1 AND c=1:和第二种一样的情况,整个索引都不会使用。 - 查询
b=1 AND a=1 AND c=1:这个查询是可以用到索引的。查询优化器分析 SQL 语句时,对于联合索引,会对查询条件进行重排序,以便用索引。上面是从guide哥那看来的 https://javaguide.cn/ 十分推荐的八股网站
27.Select * 会导致索引失效吗?
SELECT * 不会直接导致索引失效,但会让优化器更大概率 ‘放弃走索引’ 取决于where条件 范围小 回表次数少 可以使用索引 范围大不会使用
28.索引类型
物理上
主键索引 和 二级索引
主键索引是根据主键自己创建的 没有主键选唯一非空 都没有生成隐藏ROW_ID
二级索引是我们自己创建的
数据结构
B+树、hash 和 fullText
字段
主键、唯一、普通、前缀
字段个数
单列、联合
29.那些字段适合创建索引
妙计: Select 字段 from 表 and 表 where 表约束 and 查询条件 order by 条件 group by 条件
1.经常查询的字段
2.经常作为查询条件的字段
3.经常用于排序分组的字段
4.经常用于表之间约束的字段
5.不能使用为null创建
30.索引失效的原因
在左面百分计算 或在右面大范围转换
1.在联合索引中 不符合最左前缀原则
2.在使用like时前面有%的 无法确定从哪寻找
3.查询有运算函数时
4.or的左右有一个没有索引的时候
5.in的范围太大的时候
6.有隐形的数值类型转移的时候
31.MySQL查询缓存?
mysql查询缓存在8.0版本后就没了
注意! 查询缓存和InnoDB的缓存池不一样的
查询缓存根据的是SQL语句只有完全一样的时候才用缓存 而 InnoDB是根据索引和数据的不会关心SQL什么样
32.MySQL日志有哪些?
redo log、undo log、bin log、慢查询、错误日志
33.redo log 是什么?
redo log是恢复日志 它是来记录当前在某个数据页上的改动 当发生异常时便会读取日志恢复
在执行更新操作时,mysql先写redo日志 再异步刷盘到数据文件,及时宕机,重启后能通过redolog实现恢复更改,避免更改丢失
InnoDB特有的物理
34.undo log 是什么?
undo log是回滚日志 是来记住更改前的状态 执行ROLLBACK 可以回滚回原来的状态
mvcc多版本并发控制 实现可重复读 读已提交能读取到属鸡的历史版本
InnoDB特有的物理日志
35.binlog是什么?
binlog是一种二进制日志 是逻辑日志 记录变更的逻辑 用来主从复制 或者数据备份恢复
只记录增删改和结构变化 不记录查询
36.慢查询?
记录执行慢的SQL(生死录)
记录执行时间超过long_query_time的SQL 用户慢SQL优化
默认是关的
37.错误日志?
记录MySQL在启动启动、执行、停止的错误信息
38.redo Log 和 binlog的不同?
| 不同 | redo Log | binlog |
|---|---|---|
| 日志类型 | 物理日志 | 逻辑日志 |
| 记录范围 | 只记录InnoDB的数据页的变动 | 记录所有引擎的变动 |
| 写入方式 | 循环写 写满了覆盖 | 追加写 不会覆盖 可归档 |
| 所属层级 | InnoDB | mysql服务层 |
| 核心作用 | 把证事务持久性(宕机恢复) | 只从复制 数据恢复 |
39.binlog的格式和各自优缺点
1.STATENENT(语句级)
优:日志量小 占用磁盘少
缺:函数 触发器 自增列 自从同意不一致
2.ROW(行级 默认)
优:主从绝对一直
缺:日志量大 占用磁盘多
3.MIXED(混合)
优:自动下负责格式 简单用STATENENT复杂用ROW
40.什么是事务?
事务就是一组不可分割的操作集合 要么全部执行要么全部回滚 核心是为了保证数据的一致性
事务都有特性:ACID
A -> 原子性
C -> 一致性
I -> 隔离性
D -> 持久性
AID是为了C
41.并发事务带来的问题
| 并发问题 | 脏读 | 不可重复读 | 幻读 |
|---|
42.脏读是什么意思?
脏读就是在一个事务在操作的时候 有另一个事务插了进来查询数据并拿到了数据 原线程却回滚了 这就导致了数据不一致 读到了脏的数据
43.不可重复读是什么意思?
不可重复读就是一个事务在第一次读取并拿到数据 然后 另一个事务来了并修改了数据 原线程再来读的时候发现不一样了 这就是不可重复读
44.幻读是什么意思?
幻读就是一个数据在查询某个条件的数据有多少条的时候 突然另一个事务插了一条数据 在随后的查询后发现多了一些数据 导致了幻读
46.并发事务控制方法
1.MVCC多版本并发控制 每次操作都生成一个版本(可重复读)
2.锁
按照性质
共享锁多个事务可以同时获取锁(读锁) 排他锁同一时间只有一个事务可以获取锁(写锁)
按照颗粒度
表锁 行锁 全局锁(锁mysql所有库 所有表)
45.事务隔离级别有哪些
读未提交、读已提交、可重复读、串行读
读未提交:这是最低的事务隔离级别 会导致脏读幻读不可重复读
读已提交:限定只有提交之后才能读 但是还是导致不可重复读和幻读
可重复读(默认):在读的时候每个事务都会有一个副本 但是还是会有幻读
可重复读+MVCC+NEXT KEY LOCK(行锁和间隔锁) 极大程度解决了幻读
串行读:线程只能串行读取 解决了三个串行问题
46.表级锁和行级锁了解吗?有什么区别?
表级锁就是锁的范围是整个表 实现简单 加锁快 资源损耗低 不会死锁 锁长图概率高 高并发效率低
行级锁锁的范围就是索引行 颗粒度小 并发高 资源损耗高 加锁慢 会死锁
注意! 如果索引失效或者没有索引 会升级为表锁
47.行级锁的分类
记录锁:单个记录
间隙锁:一定范围左右不包括
临建锁:一定范围包括左右
记录锁是锁数据不让修改删除
间隙、临建都是锁住空白区域不让插入
48.什么是意向锁
意向锁(Intention Lock)是 InnoDB 表级锁,作用是快速判断表中是否有行锁
意向锁 分为 意向共享锁、排他锁
49.什么是快照读 什么是当前读
快照读就是普通select读取快照里的信息
当前读就是给行记录加读锁和写锁 读最新的数据
50.自增锁就是
在插入数据、使用到自增主键的时候使用的锁 保障了id的连续正常
51.SQL优化
1.查看慢日志 找到影响性能的SQl
2.修改索引 和 sql语句