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大小关系对应。

总结:哈希适用于再小范围的精确查找,在列数据很大,又不需要排序,又不需要模糊查询,范围查询时有用。

posted @   远乡人  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示
主题色彩