mysql面试题
文章平均质量分 59
msql的面试题
无语堵上西楼
这个作者很懒,什么都没留下…
展开
-
Mysql 5.7和Mysql 8到底有哪些差异
MySQL 5.7和MySQL 8之间最明显的差异之一是数据字典的变化。MySQL 8引入了新的数据字典架构,用于管理数据库的元数据信息。这一变化对于数据库的管理和性能都具有深远的影响。在MySQL 5.7及以前的版本中,系统表被用于存储数据库的元数据信息。这些系统表具有一定的限制,包括性能瓶颈和可扩展性的问题。而MySQL 8通过引入新的数据字典解决了这些问题。数据字典提高了元数据的存储效率,降低了元数据访问的成本,并使MySQL更容易扩展和维护。原创 2024-04-02 08:42:31 · 416 阅读 · 0 评论 -
truncate、delete与drop区别?having和where的区别?
作,用于逐行删除指定条件下的数据,并记录在事务日志中。(数据定义语言)操作,用于快速删除整个表中的数据,子句用于在查询之前对行进行过滤,筛选出销售总额大于。我们想要根据销售总额分组,并找出销售总额大于。是一种快速删除整个表中的数据的操作,相对于。分组,然后计算每个顾客的销售总额。子句中,我们筛选出销售总额大于1000。语句将删除表的结构被依赖的约束、触发。进行分组,并计算每个顾客的销售总额。在这个例子中,我们先将订单表按顾客。只删除数据不删除表的结构;在查询之前对行进行筛选,而。对分组后的结果进行筛选。原创 2024-03-18 17:15:02 · 331 阅读 · 0 评论 -
EXISTS和in的区别?EXISTS和普通where条件查询有啥区别
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上,而是exists用于对外表记录做筛选。exists会遍历外表,将外查询表的每一行,代入内查询进行判断。当 exists里的条件语句能够返回记录行时,条件就为真,返回外表当前记录。反之如果exists里的条件语句不能返回记录行,条件为假,则外表当前记录被丢弃。in是先把后边的语句查出来放到临时表中,然后遍历临时表,将临时表的每一行,代入外查询去查找。,使用exists可以有效减少总的循环次数来提升速度;,使用in。原创 2024-03-16 23:17:06 · 361 阅读 · 0 评论 -
sql的查询语句执行流程、更新语句执行过程
并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。日志没有被写入,那么机器重启后,这台机器会通过 redo log。提取表名、查询条件,检查语法是否有错误;校验权限,有权限就调用数据库引擎接口,返回引擎的执行结果。以前会查询缓存,缓存命中则直接返回,没有则执行下一步;,优化器根据自己的优化算法选择执行效率最好的方案;首先检查权限,没有权限则返回错误;,然后调用引擎接口,写入更新数据,的记录,有缓存会使用缓存。,然后调用引擎接口,提交。恢复数据,但是这个时候。原创 2024-03-16 22:53:16 · 324 阅读 · 0 评论 -
深分页问题,limit 1000000,10 加载很慢该怎么优化
通过 order by+索引来解决select id,name from user order by id limit1000000,10 需要注意 id 是索引列,通过索引排序后再 limit,同样减少了计算次数。通过 limit +子查询, select * from user u , (select id from user order by id limit 2000000,10) a where u.id=a.id;从业务层面来考虑,限制页数,一般情况下用户去翻 100W 页来找数据。原创 2023-11-16 16:37:12 · 190 阅读 · 0 评论 -
数据库三大范式,什么是反范式?
范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。优点缺点范式范式化的表减少了数据冗余,数据表更新操作快、占用存储空间少。查询时通常需要多表关联查询,更难进行索引优化反范式反范式的过程就是通过冗余数据来提高查询性能,可以减少表关联和更好进行索引优化存在大量元余数据,并且数据的维护成本更高所以在平时工作中,我们通常是将范式和反范式相互结合使用。原创 2023-11-09 22:38:38 · 59 阅读 · 0 评论 -
Mybatis 是如何进行分页的
有三种方式来实现分页:第一种,直接在 Select 语句上增加数据库提供的分页关键字,然后在应用程序里面传递当前页,以及每页展示条数即可。第二种,使用 Mybatis 提供的 RowBounds 对象,实现内存级别分页。第三种,基于 Mybatis 里面的 Interceptor 拦截器,在 select 语句执行之前动态拼接分页关键字。原创 2023-11-07 16:04:29 · 335 阅读 · 0 评论 -
Mybatis 中#{}和${}的区别是什么?
所以$和#最大的区别在于,前者是动态参数,后者是占位符, 动态参数无法防止 SQL注入的问题,所以在实际应用中,应该尽可能的使用#号占位符。另外,$符号的动态传参,可以适合应用在一些动态 SQL 场景中,比如动态传递表名、动态设置排序字段等。原创 2023-11-07 15:46:07 · 31 阅读 · 0 评论 -
Mybatis 里面的缓存机制
一级缓存,是 SqlSession 级别的缓存,也叫本地缓存,因为每个用户在执行查询的时候都需要使用 SqlSession 来执行,为了避免每次都去查数据库,Mybatis 把查询出来的数据保存到 SqlSession 的本地缓存中,后续的 SQL 如果命中缓存,就可以直接从本地缓存读取了。询流程是先查二级缓存,再查一级缓存,最后再查数据库。使用 CachingExecutor 装饰了 Executor,所以在进入一级缓存的查询流程之前,会先通过 CachingExecutor 进行二级缓存的查询。原创 2023-11-07 13:36:25 · 31 阅读 · 0 评论 -
执行 SQL 响应比较慢,你有哪些排查思路?
如果执行 SQL 响应比较慢,我觉得可能有以下 4 个原因:第 1 个原因:没有索引或者 导致索引失效。第 2 个原因:单表数据量数据过多,导致查询瓶颈第 3 个原因:网络原因或者机器负载过高。第 4 个原因:热点数据导致单点负载不均衡。原创 2023-10-24 11:02:49 · 189 阅读 · 0 评论 -
为什么 SQL 语句不要过多的 join?什么情况下不建索引?
主要有两个方面的原因:性能问题:每个 join 操作都需要对两个或多个表进行连接操作,这个操作需要消耗大量的计算资源和时间,如果 join 操作过多,会导致 SQL 的执行效率降低,从而影响整个系统的性能。可读性和维护性问题:join 操作会使 SQL 语句变得复杂,难以理解和维护,特别是当 join 操作涉及到多个表的时候,SQL 语句的复杂度会呈现指数级增长,给代码的可读性和可维护性带来挑战。原创 2023-10-24 10:20:53 · 102 阅读 · 0 评论 -
MySQL update 是锁行还是锁表?
在多个事务并行对同一个数据进行修改的时候,会产生事务的竞争造成脏读、幻读、不可重复读等问题。所以 Mysql 为了避免这类问题的出现,引入了事务隔离级别,其实本质上来说,最终解决的方式无非就是 LBCC 和 MVCC 两种。而锁是解决事物竞争问题的底层实现方式。通常来说,加锁会影响性能, 所以一般情况下都会考虑到性能和安全性的平衡,而 Mysql,也根据不同的作用范围,提供了不同的锁的实现方式。原创 2023-10-24 10:10:55 · 565 阅读 · 0 评论 -
MVCC 过程中会加锁吗?
所以说,MVCC 在处理过程中,虽然本身不涉及加锁,但在实际操作中,为了防止更新操作导致的数据不一致,会加锁,但对读操作是非阻塞的。原创 2023-10-23 23:31:52 · 732 阅读 · 0 评论 -
存储 MD5 的值应该用 VARCHAR 还是 CHAR
应该使用 Char 类型,原因是:char 类型是固定长度的字符串,varchar 是可变长度字符串。而 MD5 是一个固定长度的字符,不管数据怎么修改,长度不变,这个点很符合 char类型。另外,由于是固定长度,所以在数据变更的时候,不需要去调整存储空间大小,在效率上会比 varchar 好。原创 2023-10-23 22:42:11 · 207 阅读 · 0 评论 -
Mysql中MyISAM和InnoDB 引擎的区别
MyISAM 引擎MyISAM 和 InnoDB 都是 Mysql 里面的两个存储引擎。在 Mysql 里面,存储引擎是可以自己扩展的,它的本质其实是定义数据存储的方式以及数据读取的实现逻辑。而不同存储引擎本身的特性,使得我们可以针对性的选择合适的引擎来实现不同的业务场景。从而获得更好的性能。在 Mysql 5.5 之前,默认的存储引擎是 MyISAM,从 5.5 以后,InnoDB 就作为了默认的存储引擎。在实际应用开发中,我们基本上都是采用 InnoDB 引擎。MyISAM 引擎。原创 2023-10-23 21:53:22 · 168 阅读 · 1 评论 -
索引什么时候失效
在一个由多列构成的组合索引中,需要按照最左匹配法则,也就是从索引的最左列开始顺序检索,否则不会走索引。在组合索引中,索引的存储结构是按照索引列的顺序来存储的,因此在 sql 中也需要按照这个顺序才能进行逐一匹配。而在索引列上加函数运算,导致 Mysql 无法识别索引列,也就不会再走索引了。理论上来说,使用索引列查询,就能很好的提升查询效率,但是不规范的使用会导致索引失效,从而无法发挥索引本身的价值。在索引列使用不等于号、not 查询的时候,由于索引数据的检索效率非常低,因此Mysql 引擎会判断不走索引。原创 2023-10-23 19:03:13 · 164 阅读 · 0 评论 -
Mysql 事务的实现原理
理论上来说,事务提交之后直接把数据持久化到磁盘就行了,但是因为随机磁盘 IO 的效率确实很低,所以 InnoDB 设计了Buffer Pool 缓冲区来优化,也就是数据发生变更的时候先更新内存缓冲区,然后在合适的时机再持久化到磁盘。所以 InnoDB 引入了 Redo_LOG 文件,这个文件存储了数据被修改之后的值,当我们通过事务对数据进行变更操作的时候,除了修改内存缓冲区里面的数据以外,还会把本次修改的值追加到 REDO_LOG 里面。D,表示持久性,也就是只要事务提交成功,那对于这个数据的结果的影响。原创 2023-10-23 18:38:58 · 131 阅读 · 0 评论 -
数据库连接池有什么用?它有哪些关键参数?
不同的连接池框架,除了核心的参数以外,还有很多业务型的参数,比如是否要检测连接 sql 的有效性、连接初始化 SQL 等等,这些配置参数可以在使用的时候去查询 api文档就可以知道。原创 2023-10-23 18:07:03 · 578 阅读 · 0 评论 -
索引有哪些缺点以及具体有哪些索引类型
唯一索引: 数据列不允许重复,允许为 NULL 值,一个表允许多个列创建唯一索。主键索引: 数据列不允许重复,不允许为 NULL,一个表只能有一个主键。对创建了索引的表进行数据的增加、修改、删除时,会同步动态维护索引,这个部。普通索引: 基本的索引类型,没有唯一性的限制,允许为 NULL 值。组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并。合理的增加索引,可以提高数据查询的效率,减少查询时间。有一些特殊的索引,可以保证数据的完整性,比如唯一索引。创建索引和维护索引需要消耗时间。原创 2023-10-23 17:21:34 · 139 阅读 · 0 评论 -
Mysql的binlog有几种格式?分别有什么区别
记录的是 SQL 的原文。好处是,不需要记录每一行的变化,减少了binlog 日志量,节约了 IO,提高性能。由于 sql 的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如 alter table),因此这种模式的文件保存的信息太多,日志量太大。一种折中的方案,普通操作使用 statement 记录,当无法使用 statement的时候使用 row。原创 2023-10-23 15:23:40 · 24 阅读 · 0 评论 -
MySQL数据库cpu飙升的话,要怎么处理呢?
综上所述,处理 MySQL 数据库 CPU 飙升问题需要综合考虑多个方面,包括查询优化、索引优化、MySQL配置优化、硬件升级、负载均衡等。大家在回答的时候尽可能全面一点去考虑。原创 2023-10-23 15:06:48 · 403 阅读 · 0 评论 -
Mysql主从集群同步延迟问题怎么解决
复制过程分为几个步骤:主库的更新事件(update、insert、delete)被写到binlog从库发起连接,连接到主库。此时主库创建一个 binlog dump thread,把 binlog 的内容发送到从库。从库启动之后,创建一个 I/O 线程,读取主库传过来的 binlog 内容并写入到relay log从库还会创建一个 SQL 线程,从 relay log 里面读取内容,从Exec_Master_Log_Pos 位置开始执行读取到的更新事件,将更新内容写入到slave的 db。原创 2023-10-23 14:12:59 · 114 阅读 · 0 评论 -
binlog 和 redolog 有什么区别
binlog 和 redolog 的区别有很多,可以简单总结三个点:记录的信息不同,binlog 是记录数据库的逻辑变化,它提供了三种日志格式分别是statement,row 以及 mixed;redo log 记录的是物理变化,也就是数据页的变化结果。使用场景不同,binlog 主要用来做数据备份、数据恢复、以及主从集群的数据同步;Redo Log 主要用来实现 Mysql 数据库的事务恢复,保证事务的 ACID 特性。原创 2023-10-23 12:04:51 · 611 阅读 · 0 评论 -
聚集索引和非聚集索引
由于在 InnoDB 引擎里面,一张表的数据对应的物理文件本身就是按照 B+树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗 B+树,然后叶子节点里面存储了这个表的每一行数据记录。需要注意的是,InnoDB 里面只能存在一个聚集索引,原因很简单,如果存在多个聚集索引,那么意味着这个表里面的数据存在多个副本,造成磁盘空间的浪费,以及数据维护的困难。聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。原创 2023-10-23 11:49:51 · 48 阅读 · 0 评论 -
为什么索引要用B+树来实现呢,而不是B树
使用 B+树来实现索引的原因,我认为有几个方面:B+树非叶子节点不存储数据,所以每一层能够存储的索引数量会增加,意味着 B+树在层高相同的情况下存储的数据量要比 B 树要多,使得磁盘 IO 次数更少。在 Mysql 里面,范围查询是一个比较常用的操作,而 B+树的所有存储在叶子节点的数据使用了双向链表来关联,所以在查询的时候只需查两个节点进行遍历就行,而 B 树需要获取所有节点,所以 B+树在范围查询上效率更高。在数据检索方面,由于所有的数据都存储在叶子节点,所以 B+树的 IO 次数会更加。原创 2023-10-21 14:07:20 · 734 阅读 · 0 评论 -
Mysql中的RR 隔离级别,到底有没有解决幻读问题
在大多数情况下,快照读是通过读取已经存在的快照来获取数据的,而不会触发当前读。有一种情况可以导致在 RR 隔离级别下触发当前读绕过快照读,那就是使用了锁定行的语句,如 SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE。这样一种情况,在事务 1 里面通过 update 语句触发当前读的情况下,就会导致在该事务中的前后两次查询的数据行数不一致,从而出现幻读的现象。Mysql 中的 RR 事务隔离级别,在特定的情况下会出现幻读的问题。原创 2023-10-21 11:37:59 · 307 阅读 · 0 评论 -
Mysql 中的性能调优方法
分库分表、读写分离、为字段选择合适的数据类型、适当的反范式设计,适当冗余设计、为查询操作创建必要的索引但是要避免索引滥用、尽可能使用 Not Null。参数调优方面,主要可以设置 Buffer_pool 的大小,建议占总内存的 70%左右。硬件方面、主要是 CPU 核数、磁盘的读写性能(减小寻道时间、旋转时间、传输时间),可以选择 SSD、网卡、内存等方面。通过慢查询分析需要优化的 SQL 进行合理优化、利用 explain、profile 等工具分析 SQL。这四个方面的优化成本和优化效果是成反比的。原创 2023-10-21 00:11:18 · 352 阅读 · 0 评论 -
关于索引的底层实现,为什么选择 B+Tree 而不是红黑树
因此 基于局部性原理,以及 B+Tree 存储结构物理上的特性,所以 B+Tree 的索引性能比红黑树要好很多。原创 2023-10-21 00:01:07 · 169 阅读 · 0 评论 -
MySQL优化
总结一下常见的 SQL 优化规则:SQL 的查询一定要基于索引来进行数据扫描避免索引列上使用函数或者运算,这样会导致索引失效where 字句中 like %号,尽量放置在右边使用索引扫描,联合索引中的列从左往右,命中越多越好.尽可能使用 SQL 语句用到的索引完成排序,避免使用文件排序的方式查询有效的列信息即可.少用 * 代替列信息永远用小结果集驱动大结果集。原创 2023-10-20 23:08:51 · 2151 阅读 · 0 评论 -
b树和b+树
为什么用 B 树或者 B+树来做索引结构:原因是 AVL 树的高度要比 B 树的高度要高,而高度就意味着磁盘 IO 的数量。所以为了减少磁盘 IO 的次数,文件系统或者数据库才会采用 B 树或者 B+树。原创 2023-10-20 19:09:40 · 444 阅读 · 0 评论 -
innoDB如何解决幻读
虽然 InnoDB 中通过间隙锁的方式解决了幻读问题,但是加锁之后一定会影响到并发性能,因此,如果对性能要求较高的业务场景中,可以把隔离级别设置成 RC,这个级别中不存在间隙锁。原创 2023-10-20 16:51:50 · 121 阅读 · 0 评论 -
MYSQL的事务原理
事务概念事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。事务特性原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性():事务完成时,必须使所有的数据都保持一致状态。隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。持久性(Durability。原创 2023-10-11 11:31:16 · 151 阅读 · 0 评论 -
MYSQL的锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。MySQL中的锁,按照锁的粒度分,分为以下三类:全局锁:锁定数据库中的所有表。表级锁:每次操作锁住整张表。行级锁:每次操作锁住对应的行数据。原创 2023-09-18 22:26:20 · 283 阅读 · 0 评论 -
MYSQL的触发器
来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录。表的数据变更日志,将变更日志插入到日志表。触发器是与表有关的数据库对象,指在。,触发并执行触发器中定义的SQL。表示将要或者已经删除的数据。表示将要或者已经新增的数据。表示将要或已经修改后的数据。原创 2023-09-17 22:56:24 · 370 阅读 · 1 评论 -
MYSQL的游标
声明游标(CURSOR)是用来存储查询结果集的数据类型在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPENFETCH和CLOSE声明DECLARE游标名称CURSOR FOR查询语句;打开游标OPEN游标名称;获取游标记录FETCH游标名称INTO变量[,变量关闭游标CLOSE游标名称;案例根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名name。原创 2023-09-17 22:24:38 · 319 阅读 · 0 评论 -
mysql的判断语句
if 用于做条件判断,具体的语法结构如下,在if条件判断的结构中,ELSE IF结构可以有多个,也可以没有。ELSE结构可以有,也可以没有。案例如果判定条件有多个,多个条件之间,可以使用and或or进行连接。方法一。原创 2023-09-17 21:09:40 · 2660 阅读 · 0 评论 -
mysql的变量
用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用"@变量名"使用就可以。其作用域为当前连接。赋值赋值时,可以使用,也可以使用:=。用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL。原创 2023-09-17 20:23:48 · 229 阅读 · 0 评论 -
MYSQL的存储过程
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程思想上很简单,就是数据库 SQL语言层面的代码封装与重用封装,复用可以把某一业务SQL封装在存储过程中,需要用到的时候直接调用即可。可以接收参数,也可以返回数据再存储过程中,可以传递参数,也可以接收返回值。减少网络交互,效率提升如果涉及到多条SQL,每执行一次都是一次网络传输。原创 2023-09-17 13:38:43 · 385 阅读 · 2 评论 -
MYSQL的视图
视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。创建CREATEOR视图名称[(列名列表)]AS SELECT语句查询查看创建视图语句:SHOWCREATEVIEW视图名称;查看视图数据:SELECT *FROM视图名称......;修改。原创 2023-09-16 22:59:07 · 238 阅读 · 0 评论 -
InnoDB的页分裂与页合并
存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。那也就意味着, 一个页中所存储的行也是有限的,如果插入的数据行row。2#的数据记录,当页中删除的记录达到 MERGE_THRESHOLD。50的记录,因为索引结构的叶子节点是有顺序的。在该页存储不小,将会存储到下一个页中,页与页之间会通过指针连接。的数据之后,那么此时,这三个页之间的数据顺序是有问题的。行数据,都是存储在聚集索引的叶子节点上的。删除数据,并将页合并之后,再次插入新的数据。页中的,而每一个页的大小是固定的,默认。原创 2023-09-16 09:54:22 · 213 阅读 · 0 评论