MySQL
概述:
- 关系型数据和非关系型数据库的区别,有哪些应用场景
- 有哪些非关系的
单表操作:
-
三种SQL语言类型,MySql本身常用命令
-
DDL-数据定义语句:
- 表的常用操作
- truncate / delete --drop 操作的区别
- varchar最大字节数
-
DML
- Update语句的sql执行流程
- 对行数据的修改是在两阶段提交的哪个阶段。
- Update语句的sql执行流程
-
DQL
-
select条件查询
-
between 和null
-
and 和 or的优先级
-
统计总分大于180并且语文大于90的同学的数据
-
-
in的作用
-
模糊查询
-
MySQL的 in 和 exists 怎么用
-
-
排序查询:
- 升序和降序,按a字段升序b字段降序怎么排
-
分组查询(函数查询):
- 分组函数:
-
有哪些,作用是什么。不分组默认一个组
-
空值的处理!
-
和where
- 只能where price = (SELECT MAX(price) FROM product);
-
count 和count*
-
多字段分组
-
- 分组函数:
-
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式]; 执行顺序。
-
where 和 having
- 优先where过滤
-
去重
-
多表操作:
- 约束
- 连接查询:
- 内连接:
-
显式内连接:
-
隐式内连接:内连接中 WHERE 子句和 ON 子句是等价的
-
等值,非等值
-
- 外连接:
- 左连接,右连接,可以互换
- 如果改变表 join 顺序,10个表一起 join
- 嵌套查询/子查询。
- 可以嵌套在哪
- 讲讲mysql的子查询可以被什么代替,左连接。
- union的作用,union all
- 分页查询:
- SQL如何分页?Limit是如何实现分页的?
- 分页查找,数据量很大,limit查询性能会不会有影响,怎么避免?
视图与存储过程
- 了解
体系架构
- 整体架构--有几层
-
建立连接
- mysql达到最大连接数的问题,mysql连接器作用。链接池
-
解析优化
如何判断是否使用了缓存,缓存取消- 讲一下优化器,有哪些优化部分
-
事务在哪里实现
- 谁负责数据的存储与提取
-
MySQL查询和插入流程
-
存储引擎:
- 基本介绍,作用
- MySQL存储引擎有哪些:SHOW ENGINES
- 默认存储引擎和字符
- 不同的存储引擎支持的索引和特点
- innodb引擎如何实现。
-
innodb结构为什么这样设计,
- 物理和逻辑存储结构,一个Row行中存有什么
- 内存,磁盘结构,内存-->磁盘(后台线程)
- 能讲讲buffer pool,change buffer
- buffer pool 刷盘时机
- 表空间碎片
-
和事务一起看
-
Innodb与MyISAM 的区别
索引机制:
-
索引介绍
-
索引解决了什么问题,为什么要索引
- 查询数据库的表两种方式
-
索引的优缺点
- 什么时候加索引
- 底层实现
-
-
索引的操作
- 怎么看是否用了索引
- 创建索引的命令
-
索引的结构
-
数据页:节点和数据页
-
B+树
- B+树的原理
- 二叉平衡树和红黑树(自平衡排序二叉树)的查询时间复杂度
- 索引为什么用b+树,为啥不用二叉树
- B树和B+树的区别是什么?为什么不用b树。
- 为什么使用B+树而不是使用HashMap,hash的优缺点
- 还有哪些使用其他数据结构的数据库,为什么redis使用的是哈希索引
- B+树叶子节点结构特点-优化结构
- 优化:B+树的非叶子节点为什么是双向链表。
- 二叉平衡树和红黑树(自平衡排序二叉树)的查询时间复杂度
- B+树影响磁盘IO次数的因数有哪些?B+树的查询只访问一次磁盘吗?
- MySQL InnoDB B+树底层原理了
- 一个8字节big int数据+6字节主键,算三层树能存储多少条数据
- 什么因素会影响层数,B+树每一层越宽越好吗
- 一般b+树高度,每层存多少数据
- varchar类型和bigint类型选择哪个建立索引-可以从查询角度回答
- 索引维护:插入一条数据B+树的分裂情况
- b+树新增、删除节点是怎么操作的?
- B+树的原理
-
-
索引的分类
- 按照功能:唯一(NULL),主键索引,组合索引。
- 手机号适不适合当主键
- 主键为什么是整型并且是自增的,从效率上
- 手机号适不适合当主键
- 结构:B-Tree索引、哈希索引、R-Tree索引、全文索引等等
- 聚簇索引和二级索引:
- 聚簇索引和非聚簇索引的底层实现,以及区别
- 如何创建呢:聚簇和非聚簇怎么创建
- 聚簇索引的缺点:
- 聚簇索引具体存储结构是什么,插入过程,查询过程
- MyISAM的索引保存:索引和数据分开存储
- 聚簇索引和非聚簇索引的底层实现,以及区别
- 按照功能:唯一(NULL),主键索引,组合索引。
-
索引的设计原则
- 什么时候需要建立索引,什么样的数据不推荐加索引
- 走索引一定更快吗,数据量大小
- 要使用/设计一个索引要考量哪些原则。从三个方面
- 什么时候需要建立索引,什么样的数据不推荐加索引
-
索引的优化
- 覆盖索引
- 什么是覆盖索引,什么场景适合覆盖索引。
- 回表查询,怎么避免回表,为什么不建议select *
- 什么是索引下推:
- 索引合并
- mysql查询条件有两个独立的索引同时,mysql使用谁
- 覆盖索引
系统优化
-
优化步骤--索引性能分析
- 怎么对MySQL进行调优,工具有哪些。
- 怎么看语句执行频率
- 定位低效语句:
- 如何定位低效SQL语句-日志
- Profile分析:常用命令,看各阶段/cpu
- Explain语句--从执行计划角度
- 各个字段含义,重点关注哪个字段。explain调优。
- index和ref的区别
- Extra中 的参数意思。
- 各个字段含义,重点关注哪个字段。explain调优。
- 怎么处理慢查询?假设确实走了索引但是还是很慢,你会怎么排查?
-
索引优化
-
避免失效--失效的几种情况
-
语句错误--索引失效及场景
-
最左前缀
- 部分失效
- 最左匹配与入参顺序有关吗(有and和没有and)
- 为什么要遵守前缀匹配
-
范围查询:
-
函数操作
-
字符串:单引号:
- 有一个字段varchar a,where a = 1会不会走索引?变成where a='1'呢?
- select x from y where id = 1111 order by create_time limit 1999,100。可能使用到什么索引,这个sql有什么问题?执行效率上有什么问题? create_time,id
-
模糊查询:
- %x定位不到区
- 左右模糊查询区别
-
给一张表,字段为ABCD,如果查询ABC,AC,CD,怎么设置索引 (a,b,c)联合索引但是where c=1会不会有用 组合索引 A B C, where A = x and C = x 会触发索引吗 where C = x and B = x and A = x 有一个A,B,C的联合索引 select * from xx where A=1 and B=1 orderby C limit 1000能用到几个字段? AB用到了,使用explain尝试了,C是可以用到的 联合索引(a, b, c) , a = 3 and b > 4 会走索引吗? a = 3 and b > 4 order by b 呢,会走索引吗
-
-
-
系统优化:
-
底层原理:
- 索引为什么失效,从索引的结构的层面
-
-
表的优化
- 分区表(非重点)
- 临时表
- 跨库查询(略看)
-
Sql优化
-
数据插入
-
自增主键,连续
- 自增的上限,MySQL自增主键用光了怎么办?,分库分表
-
分组和排序
-
分页查询优化:
- 很大的数据量如何优化:
-
统计计数
- count的实现,count不同字段
-
update优化
- 行锁和表锁
-
使用提示:
- 索引用的不对怎么强制使用索引?
-
数据库优化/调优有哪些,说一下sql调优经历,我说索引和表关联
- 加redis
-
事务
-
什么是事务:
-
事务管理
- 基本的操作,默认开启事务
-
隔离级别:
- 数据库事务会相互影响吗,mysql默认隔离级别
- 解决读写问题
- 不同隔离级别解决了什么问题/ 还有什么问题
- 幻读,幻读和不可重复读的区别
- RC和RR如何保证-见MVCC
- 数据库事务会相互影响吗,mysql默认隔离级别
-
ACID 特性及实现(InnoDB)
-
持久性--用哪个log,存放位置,存储格式
- WAL原则好处
- 日志刷盘时机
- redolog怎么从故障中恢复
- 日志对比:
- 恢复数据库你觉得是用redo log还是bin log?
- 日志两阶段提交
- 为了解决什么,见javaguide
-
原子性:
- 存放位置和作用
- undo log什么时候删除
-
隔离性:
-
一般使用MVCC/锁解决,读写/写写冲突(乐观悲观)
-
快照读和当前读
- 什么语句对应快照读(无锁),什么语句对应当前读(共享/排他)
- 快照读又包含RC/RR/serializable
- 快照读是出现读写冲突时(非阻塞读),而当前读已经加读写锁了
- 什么语句对应快照读(无锁),什么语句对应当前读(共享/排他)
-
快照读的RC/RR实现方式MVCC(多版本并发控制):用来解决读写冲突
-
MVCC怎么实现的
-
undo log 版本链,数据库隐藏字段,Read view
-
Read view--返回版本链哪个
- 读视图产生时机,RC和RR的区别
- 存储了哪几个字段
- 可见算法分析
-
-
MVCC解决了什么问题--脏/幻/不可重复读
- 产生不可重复读和幻读的根源
- MVCC能解决幻读吗:快照读(RC/RR/serializable)可/当前读不可
- 当前读要通过锁解决
- RR用MVCC怎么实现的?RR怎么解决不可重复读
- RR存在什么问题如何解决(幻读)
- 快照读就是普通select 用的是MVCC(不完全解决)
- 当前读就是select + lock 锁机制 读的是最新数据(会幻读)
- 条件列未使用到索引,RR锁表,RC锁行
- 注意RC和RR也可以基于锁实现,用MVCC只是为了不阻塞。
-
-
-
一致性含义
- 怎么实现的
-
加锁分析:
- 不同级别怎么加锁
- RC和RR
- 插入新数据的锁
- 不同级别怎么加锁
锁
-
锁的基本介绍:
- 锁的分类:按粒度分类,各自的优缺点,适用范围(什么时候加)
- 引擎支持的锁的类型
-
表级锁的分类,锁冲突概率
- 怎么加/解锁
- 表锁:分类
- 元数据锁作用
- 意向锁
- 和元数据锁的区别
- 语法,与其他锁的兼容性
-
行锁锁分类:针对索引加锁
-
可分为记录锁(Record lock),间隙锁,next key lock(临键锁)
- 记录锁:
- mysql加行锁有什么问题,如何解决
- 什么时候加记录锁
- 间隙锁的作用,优缺点
- 普通索引和唯一索引上加行级锁有什么区别
- Next Key Lock底层如何
- 记录锁:
-
锁的兼容性
- 不同的DML语句是什么锁,读锁写锁的具体代码
-
如何解决的幻读
- 两种方案
- 如果在>80的范围内插入一条90的数据会不会出现幻读,怎么解决的
-
mysql死锁情况,解决方案,怎么发现
-
-
锁的相关问题:
- update100行用for循环单线程更快还是多线程更快(没加索引的情况下)
- delete from test where a = '1' ,a 既不是主键也不是普通索引,判断加什么锁? 表锁。
- mysql大表增加一列字段可能会出现什么问题怎么解决
范式
-
数据库范式意义,生产环境一般用哪种
-
不满足第三范式会有什么影响弊端
MySQL主从
日志
-
binlog和redolog的区别,属于哪个
-
三个日志 redolog和binlog是否是必须的 为什么
-
update涉及什么日志,过程是什么
-
mysql怎么持久化,binlog和redolog日志的写入机制是什么
优化-分库分表
-
目的是什么
-
分库分表的区别,优点
- 垂直分库/分表
-
水平分库分表
- 分表用什么字段好,分表策略
-
分库分表后如何查询数据。使用ShardingJDBC即可ShardingJDBC既提供了读写分离的功能也提供了分库分表查询的功能
- 理论+实战,详解Sharding Sphere-jdbc
- sharding-jdbc 的原理
-
说一下关系数据库常见的一对多、多对多的场景
-
有没有测试过跨表查询