Mysql面试题
1.左右连接区别?
left join(左连接)查询的包括左表的所有记录和右表中交集的记录,如果右表中的没有对应数据,按null补充。
right join(右连接) 查询的包括右表的所有记录和左表中交集的记录。如果左表中的没有对应数据,按null补充。
2.having和where的区别?
(1)having 后面可以进行聚合函数的判断,where后不可以跟聚合函数
(2)where在分组之间进行限定,如果不满足条件,则不参与分组。having在分组之后,如果不满足条件,则不会被查询出来。
3.char和varchar的区别? char 定长字符串 varchar变长字符串
区别一:定长和变长
char表示定长,长度固定,varchar表示变长,即长度可变。
char因为长度固定,char的读取速度还是要比varchar要快得多,方便程序的存储于查找,但是会占据多余的空间。
区别二:存储的容量不同
对char来说,最多能存放的字符个数255。
对varchar呢,varchar的最大有效长度由最大行大小和使用的字符集确定。
4.三范式是什么?
第一范式:第一范式每一列不可再拆分,列为原子性
第二范式:确保表中的每列都和主键相关
第三范式:确保每列都和主键列直接相关,而不是间接相关
5.说一下sql是怎么优化的?
shou variables like '%like%';查询慢查询日志相关的设置,找出慢查询的sql,用explain查询sql的执行计划,该加索引的加索引,尽量少连接查询,避免类型转换,减少回表次数
6.Mysql索引
索引的概念,优缺点分析,类型
索引是帮助mysql高校获取数据的数据结构
优点:1.保证数据库表中每一行的数据的唯一性
2.加快数据的检索效率
3.加速表与表之间的连接
4.可以减少在使用分组查询和排序查询的时间
5.通过使用索引对数据进行排序,降低数据排序的成本,降低CPU的消耗,可以使用优化隐藏器,提高系统的性能
缺点:1.创建索引和维护索引要耗费时间
2.索引会占据磁盘空间
3. 以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度。
索引类型:索引列中的值是唯一的并且不允许有空值
普通索引:mysql的基本索引类型,没有什么限制,允许有重复值和空值
唯一索引:索引列中的值是唯一的,但是允许有空值
Mysql几个存储引擎,innodb 和MyISAM区别
MySQL有多种存储引,MyISAM、InnoDB、MERGE、MEMORY(HEAP)等
InnoDB和MyISAM的区别:
1.InnoDB 支持事务,MyISAM 不支持事务。
2. InnoDB 支持外键,而 MyISAM 不支持。
3.InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针(就是物理地址)。主键索引和辅助索引是独立的 。
注意:MyISAM 无论是主键还是非主键索引 ,data存储的都是这条数据的物理地址(地址指针),innodb 主键索引的data就是这条数据,非主键索引的data是主键id,
Mysql事务隔离级别
概念:*概念∶多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
*存在问题:1.脏读:一个事务,读取到另一个事务中没有提交的数据
2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
3.3.幻读∶一个事务操作(DNL)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
*隔离级别∶1. read uncommitted :读未提交 *产生的问题:脏读、不可重复读、幻读
2. read committed !读已提交(oracle)*产生的问题:不可重复读、幻读
3. repeatable read :可重复读(MysQL默认)*产生的问题:幻读
4. serializable :串行化 *可以解决所有的问题
*注意:隔离级别从小到大安全性越来越高,但是效率越来越低
*数据库查询隔离级别∶select @@tx_isolation;
*数据库设置隔离级别∶*set global transaction isolation level级别字符串;
数据库是如何保证事物的隔离性的呢?
数据库是通过加锁,来实现事务的隔离性的
从数据库系统角度分为三种:排他锁、共享锁、更新锁。
从程序员角度分为两种:一种是悲观锁,一种乐观锁,等等
避免死锁方式:
结构化数据建模:基于范式原则初级建模
热点业务排解:挖出核心业务模型
应用拆解:降低时间片复杂度
提升性能:优化代码,集群、超时机制、回滚机制
那么,如何解决加锁后的性能问题的? MVCC多版本并发控制
事务版本号:事务每次开启前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。这就是事务版本号
隐式字段
undo log:事务回滚时,保证原子性和一致性。
用于MVCC快照读。
版本链:可以看到事务版本号,隐藏的字段,undo log
mq是啥?
消息队列,涉及到mq的写代码去查mq消息生成没生成,内容对不对是不是就行了。
业务场景:比如之前看到一个项目,有个注销账户操作,用户提交注销后会往mq发一条消息,然后等30天以后再去消费
业务背景是什么?为什么要等30天才消费?
比如涉及到买票乘车业务,这里边会有单边交易,追缴交易,追缴期限是30天,注销后会有交易逻辑删除,没办法追缴了,所以搞了30天。
mysql 数据库存储结构
B-tree 与哈希索引的区别
B-tree索引
B-tree 索引是按照顺序存储的,所以,如果按照B-tree 索引,可以直接返回带顺序的数据,但这个数据只是该索引列含有的信息,因此是顺序I/O。适用于精准匹配,范围匹配,最左匹配
Hash索引
Hash索引
索引列值的哈希值+数据行指针:因此找到后还需要根据指针去找数据,造成随机I/O
适用于精确匹配
不适用模糊匹配,范围匹配,不能排序
总结:
1.hash索引仅满足‘=’,‘IN’,和‘<=>’ 查询,不能使用范围查询
因为hash索引比较的是hash运算之后的hash值,因此只能进行等值的过滤,
不能基于范围的查找,因为经过hash算法处理后的hash值的大小关系,不能保证与
处理前的hash大小关系对应。
总结:哈希适用于再小范围的精确查找,在列数据很大,又不需要排序,又不需要模糊查询,范围查询时有用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!