小林coding|八股|MySQL
SQL基础
数据库三大范式是什么?
第二范式:当是联合主键(A,B)时,每一列都必须和A有关 并且 和B有关。
MySQL如何避免重复插入数据?
理解不了
MySQL 怎么连表查询?
连表查询,ON是两个表连接起来的 中介,也是两个圈圈相交的部分
内连接 符合ON 【条件】才留下
左连接 符合ON 【条件】+左表是亲儿子 都留下
右连接 符合ON 【条件】+右表是亲儿子 都留下
全连接 都不看ON【条件】 直接全部留下
- 内连接:
说一下外键约束
因为数据库要遵循第三范式,所以有的表要分为2个。但这2个表又要有连接,所以有了外键约束这个语法
外键约束是主表主键与从表外键之间的关系
两个表因为外键产生了特别的链接
外键的主要作用是:数据插入删除的完整性
可以直接插入 插入 (104, 赵六, 22, 3),因为课程ID 3(历史)在 courses表中存在。
插入 (105, 钱七, 20, 99),数据库会报错,因为课程ID 99在 courses表中不存在。
MySQL的关键字in和exist
in:先制作符合子查询的从表,拿着主表在从表中一个个查。 适合小子表,因为会制作一个符合条件的从表。
exsit:拿着主表直接在从表中查,查到就触发短路机制。适合大子表
mysql中的一些基本函数,你知道哪些?
select在这里就不是查询了,而是请生成。
执行后的结果是
Greeting |
---|
Hello World |
sql题:给学生表、课程成绩表,求不存在01课程但存在02课程的学生的成绩
存储引擎
引擎引擎,全称是存储引擎啊
说一下mysql的innodb与MyISAM的区别?
索引
首先得知道 主键索引的叶子节点是数据,索引不单单是索引(目录),还是存储引擎中的存储结构。
二级索引的叶子节点就是主键值。就不是实际数据了。
MySQL聚簇索引和非聚簇索引的区别是什么?
我终于知道了,感谢豆包。
聚簇索引它是一个存储结构!叶子节点中就把MySQL的数据支起来了。
二级索引他才是我们常说的目录!叶子节点是指向主键的指针。实际数据在主键的聚簇索引中!!!
如果聚簇索引的数据更新,它的存储要不要变化?
- 要看他是不是主键字段,如果是主键字段,就要维护b+树的有序性了。
- 如果不是,完全不需要理会。
性别字段能加索引么?为啥?
说出这个二级索引区分度很低且需要很复杂的回表操作即可
说说B+树和B树的区别
- 从非叶节点说:因为B树的这些节点中又有索引又有数据,所以一个框框里节点会更少(饶了很多次弯才想到)。所以B+树会更矮胖。
- 从叶子节点说:B+树之间用双向链表连接了起来,更有利于范围查询。
为什么 MySQL 不用 跳表?Redis不用B+Tree?
- 首先我们知道MySQL主要是select查询语句居多。2kw条数据B+Tree只需要3次io操作,但跳表需要24次io操作(2^24次方),显然B+Tree会更好。
- Redis的应用场景中查操作B+Tree与跳表因为在内存中,这个查询速度并不会太受影响。但是插入操作,B+tree会很复杂
联合索引的实现原理?
- 一旦提到联合索引就必会碰到一个问题:最左匹配原则。
- 联合查询(a,b)。a是全局有序的(1,2,2,2,3,3,3,4),b是无序的(12,7,8,2,3,8,10),可以看到此时b根本就不符合B+Tree要求的索引是有序的。
什么是覆盖索引?
- 当我们谈论联合索引时,一定会说到覆盖索引
- 覆盖索引就是 不需要回表操作,索引中就包含需要查询的值的
索引优化详细讲讲
- 前缀索引(前缀索引优化):把索引缩短
- 覆盖索引(覆盖索引优化):不需要回表
- 记住select…where A or B中。A,B都需要是索引列,不然索引会失效。查询就变成了全表扫描。
事务
mysql可能出现什么和并发相关问题?
- 脏读。一个客户端读到了另一个客户端尚未提交的数据。
- 不可重复读。一个客户端一直读,且读的前后数据不一样
- 幻读。第一次读,第二次读数据条数不同。怀疑自己是不是出现了幻觉。是最难避免的
事务的隔离级别有哪些?
- 【读未提交】 顾名思义读到未提交的数据
- 【读提交】 读提交了的数据
- 【可重复读】事务A开始时,会 有一个readview(约等于在启动事务的时候拍了一张快照),事务A中读的是快照,提交事务后才是正常读
- 【串行化】 没有了并行,事务都是串行执行
举个例子说可重复读下的幻读问题
事务A读不到这条数据(因为Read View),但却可以update。
锁
在这里补充 / 图解MySQL
日志
经典的两个问题,redo log 与 undo log
性能调优
给你张表,发现查询速度很慢,你有那些解决方案
- 索引优化
- 引入redis
- 当单表数据超过2kw时,将表分为几个小表。
架构
MySQL主从复制了解吗
从库就是把主库复制了一遍。【主库】负责写,【从库】负责读。