版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年mysql常见的面试题及答案基础篇1.请说明InnoDB和MyISAM存储引擎的核心区别,以及当前主流场景下的选型建议答:两者核心区别如下:①事务支持:InnoDB支持ACID事务,实现了4种隔离级别,适合需要事务保证的业务场景;MyISAM不支持事务,仅适用无事务要求的只读场景。②锁粒度:InnoDB默认实现行级锁,并发性能更高,仅在未命中索引时会升级为表锁;MyISAM仅支持表级锁,写入时会阻塞所有读写操作,并发性能极差。③索引结构:InnoDB主键索引为聚簇索引,叶子节点存储整行数据,非聚簇索引叶子节点存储主键值,查询时需要回表;MyISAM所有索引都是非聚簇索引,叶子节点存储数据行的物理地址,没有回表概念,但数据和索引分离,缓存命中率更低。④崩溃恢复:InnoDB通过redolog和undolog实现崩溃安全,异常重启后可以自动恢复未完成的事务,保证数据一致性;MyISAM没有崩溃恢复机制,异常宕机后可能出现数据损坏,需要手动修复。⑤外键支持:InnoDB支持外键约束,保证数据的参照完整性;MyISAM不支持外键。⑥计数性能:MyISAM内置全表总行数计数器,无where条件的count(*)查询可以直接返回结果;InnoDB需要扫描符合条件的行统计数量,无where条件的count(*)性能随表数据量增大而下降。选型建议:MySQL5.7之后MyISAM已经停止迭代,8.0版本已经默认移除MyISAM,所有业务场景优先选择InnoDB,仅当表为只读小表、且对查询速度有极致要求时可以考虑MyISAM。2.请说明char和varchar的区别,以及varchar(50)和varchar(200)的性能差异答:char是定长字符串类型,存储时会按照定义的长度分配固定空间,超出长度会截断,适合存储长度固定的字段,比如手机号、身份证号,最大长度支持255字符;varchar是变长字符串类型,存储时只会占用实际字符长度+1/2字节的长度记录位(长度小于255用1字节,大于等于255用2字节),适合存储长度波动大的字段,最大长度支持65535字节。varchar(50)和varchar(200)存储相同数据时的磁盘占用完全一致,但存在两点性能差异:①排序、分组操作时,MySQL会按照定义的长度分配内存空间,varchar(200)会占用更多的排序内存,降低排序性能;②建立索引时,varchar(200)的索引项占用空间更大,相同innodb_buffer_pool_size下能缓存的索引条目更少,降低索引缓存命中率。因此字段定义时应该按照实际业务需求设置最小的varchar长度。3.请说明count(*)、count(1)、count(列名)的执行差异和性能排序答:三者语义存在本质区别:count(*)统计所有符合条件的行数,包含列值为NULL的行;count(1)是统计所有符合条件的行数,和count(*)语义完全一致;count(列名)统计符合条件的行中,指定列值不为NULL的行数。性能层面:InnoDB优化器会对count(*)和count(1)做等价优化,两者性能完全一致,不存在谁更快的差异;count(列名)需要额外判断列值是否为NULL,且无法利用部分覆盖索引,性能弱于前两者。性能排序为:count(*)=count(1)>count(主键)>count(普通非空列)>count(允许为NULL的列)。索引优化篇1.请解释聚簇索引、非聚簇索引、回表、覆盖索引的概念答:聚簇索引是索引和数据存储在一起的索引结构,叶子节点存储整行数据,InnoDB中主键索引就是聚簇索引,一个表只能有一个聚簇索引;如果表没有定义主键,InnoDB会选择第一个唯一非空索引作为聚簇索引,没有符合条件的索引时会生成隐藏的6字节rowid作为聚簇索引的键。非聚簇索引也叫二级索引,叶子节点不存储整行数据,只存储索引键值和对应的主键值,一个表可以建立多个非聚簇索引。回表是指通过非聚簇索引查询到主键值后,需要再到聚簇索引中查找整行数据的过程,回表会产生随机IO,是影响索引查询性能的重要因素。覆盖索引是指非聚簇索引的叶子节点已经包含了查询需要的所有列,不需要再执行回表操作,比如查询`selectid,namefromuserwherename='张三'`,如果建立了(name,id)的联合索引,索引叶子节点已经包含了需要的id和name字段,不需要回表,性能可以提升数倍。2.请说明联合索引的最左匹配原则,以及索引失效的常见场景答:最左匹配原则是指联合索引查询时,会按照索引定义的最左侧列开始匹配,遇到范围查询(>、<、between、like前缀匹配)后,后面的索引列将无法生效。比如定义联合索引(a,b,c),wherea=1andb=2andc=3可以用到全部三个列的索引;wherea=1andb>2andc=3只能用到a和b两个列的索引,c列无法生效;whereb=2andc=3无法用到该联合索引。索引失效的常见场景包括:①where条件使用or,且or两侧有一个列没有索引;②联合索引查询不满足最左匹配原则;③索引列上执行函数计算、算术运算、隐式类型转换;④like查询使用后缀匹配或全模糊匹配(比如'%abc'、'%abc%');⑤字符串类型字段查询时没有加引号,触发隐式类型转换;⑥where条件对索引列使用isnotnull判断(isnull可以用到索引);⑦优化器判断全表扫描性能优于走索引时,比如表数据量极小、查询结果占总数据量20%以上时,会放弃索引走全表扫描。3.请解释ICP(索引条件下推)和MRR(多范围读)的优化逻辑答:ICP是MySQL5.6引入的优化特性,核心逻辑是将where条件中可以通过索引过滤的判断逻辑下推到存储引擎层执行,不需要将所有满足索引前缀的行都回表后再到server层过滤,大幅减少回表次数和数据传输量。比如联合索引(a,b),查询wherea=1andblike'test%',没有ICP时存储引擎会返回所有a=1的行,回表后server层再过滤b符合条件的行;开启ICP后,存储引擎层会直接过滤b符合条件的行再回表,性能提升明显。MRR也是5.6引入的优化特性,核心逻辑是在非聚簇索引查询需要回表时,先将查询到的主键值按照升序排序,再按照排序后的顺序到聚簇索引中批量查询数据,将原来的随机IO转换为顺序IO,大幅减少磁盘随机访问开销,适合大量回表的查询场景。事务与MVCC篇1.请说明事务的ACID特性,以及InnoDB中对应特性的实现机制答:ACID是事务的四大核心特性:①原子性(Atomicity):事务是不可分割的最小执行单元,所有操作要么全部成功,要么全部失败回滚;InnoDB通过undolog实现原子性,所有修改操作都会记录对应的undo日志,事务执行失败时通过undo日志回滚已经执行的修改。②一致性(Consistency):事务执行前后,数据的完整性约束不会被破坏,是事务的最终目标;原子性、隔离性、持久性都是为了保证一致性,同时业务层面的逻辑正确性也是一致性的必要条件。③隔离性(Isolation):多个事务并发执行时,事务内部的操作和其他事务互相隔离,互不干扰;InnoDB通过锁机制和MVCC(多版本并发控制)实现不同级别的隔离性。④持久性(Durability):事务提交后,对数据的修改会永久生效,即使系统宕机也不会丢失;InnoDB通过redolog实现持久性,修改操作先写redolog再写磁盘数据,宕机后可以通过redolog恢复未刷入磁盘的已提交数据。2.请说明SQL标准的四个事务隔离级别,以及InnoDB对幻读的解决机制答:四个隔离级别从低到高分别为:①读未提交(ReadUncommitted):事务可以读取到其他未提交事务的修改,存在脏读、不可重复读、幻读问题,生产环境基本不使用。②读已提交(ReadCommitted):事务只能读取到其他事务已经提交的修改,解决了脏读问题,存在不可重复读、幻读问题,Oracle、PostgreSQL等数据库的默认隔离级别。③可重复读(RepeatableRead):同一个事务内多次读取同一行数据的结果完全一致,解决了脏读、不可重复读问题,是InnoDB的默认隔离级别。④串行化(Serializable):所有事务串行执行,完全避免并发冲突,解决了所有异常问题,但并发性能极差,仅适用对数据一致性要求极高、并发量极低的场景。其中脏读是指读到其他事务未提交的脏数据;不可重复读是指同一个事务内两次读取同一行数据,结果不一致(中间被其他事务修改并提交);幻读是指同一个事务内两次执行范围查询,第二次查询多出了符合条件的行(中间被其他事务插入了符合条件的数据并提交)。InnoDB的可重复读级别下,通过MVCC解决了快照读(普通select语句)的幻读问题;通过临键锁(Next-KeyLock)解决了当前读(select...forupdate、update、delete、insert)的幻读问题。3.请解释MVCC的实现原理答:MVCC(多版本并发控制)是InnoDB实现读写不冲突的核心机制,通过读取数据的历史版本实现无需加锁的读操作,大幅提升并发性能,核心由三部分组成:①隐藏列:InnoDB每行数据都有三个隐藏列:row_id(无主键时作为聚簇索引键)、trx_id(最后一次修改该行的事务ID)、roll_pointer(指向undolog中该行上一个历史版本的指针)。②undolog版本链:每次修改行数据时,都会将修改前的版本写入undolog,通过roll_pointer将多个历史版本串联成版本链,供并发事务读取。③ReadView:事务执行快照读时会生成一个一致性视图,包含四个核心字段:m_ids(生成ReadView时当前活跃未提交的事务ID集合)、min_trx_id(活跃事务的最小ID)、max_trx_id(系统下一个要分配的事务ID)、creator_trx_id(当前生成ReadView的事务ID)。版本可见性判断规则为:如果行的trx_id等于creator_trx_id,说明是当前事务自己修改的,可见;如果trx_id<min_trx_id,说明修改该行的事务在ReadView生成前已经提交,可见;如果trx_id>=max_trx_id,说明修改该行的事务在ReadView生成后才开启,不可见;如果trx_id在min_trx_id和max_trx_id之间,判断是否在m_ids中,在的话说明事务未提交,不可见,不在的话说明已经提交,可见。如果当前版本不可见,就顺着roll_pointer向下查找历史版本,直到找到可见版本或者版本链结束。锁机制篇1.请说明InnoDB的锁分类,以及临键锁的作用答:InnoDB的锁可以按照粒度和类型两个维度分类:按照粒度分为三类:①全局锁:对整个数据库加只读锁,执行`flushtableswithreadlock`开启,所有写入操作都会被阻塞,一般用于全库逻辑备份;②表级锁:包括表读写锁和MDL(元数据锁),MDL是自动加的,查询操作加MDL读锁,DDL操作加MDL写锁,读锁之间不冲突,读写、写写之间互斥,长事务持有MDL读锁会导致后续DDL和所有查询被阻塞;③行级锁:锁定单行或多行数据,是InnoDB并发性能高的核心。按照类型分为两类:①共享锁(S锁):也叫读锁,多个事务可以同时加S锁,互不阻塞,通过`select...lockinsharemode`显式加锁;②排他锁(X锁):也叫写锁,一个事务加X锁后,其他事务不能加任何锁,update、delete、insert、`select...forupdate`都会自动加X锁。行级锁又分为三种:①记录锁:锁定单个索引记录;②间隙锁:锁定两个索引记录之间的间隙,防止其他事务插入数据,间隙锁之间不互斥;③临键锁:是记录锁+间隙锁的组合,锁定左开右闭的区间,是InnoDB默认的行锁算法,核心作用是解决当前读的幻读问题。2.请说明死锁的产生条件和避免方案答:死锁是指两个或多个事务互相持有对方需要的锁,同时等待对方释放锁,导致永久阻塞的现象,产生的四个必要条件为:互斥条件(资源只能被一个事务持有)、持有并等待(事务持有至少一个资源,又请求其他被持有的资源)、不可剥夺(资源不能被强制剥夺,只能由持有事务主动释放)、循环等待(多个事务之间形成循环等待资源的链路)。常见避免方案:①所有事务按照相同的顺序访问资源,破坏循环等待条件;②大事务拆分为多个小事务,减少持有锁的时间和范围;③尽量使用索引查询,避免全表扫描导致行锁升级为表锁,增加锁冲突概率;④降低事务隔离级别到读已提交,减少间隙锁的范围,降低冲突概率;⑤设置合理的锁等待超时时间`innodb_lock_wait_timeout`,避免长时间阻塞;⑥避免长事务,减少MDL锁和行锁的持有时间。架构与高可用篇1.请说明MySQL主从复制的原理、流程,以及半同步复制、并行复制的优化逻辑答:主从复制基于binlog实现,主库将修改记录写入binlog,从库拉取binlog到本地重放,实现主从数据一致,核心流程为:①主库事务提交前,将修改操作记录到binlog;②从库的IO线程和主库建立连接,请求拉取指定位置之后的binlog;③主库的dump线程读取本地binlog,发送给从库的IO线程;④从库IO线程将接收到的binlog写入本地的relaylog(中继日志);⑤从库的SQL线程读取relaylog,重放执行修改操作,实现数据同步。半同步复制是相对于异步复制的优化:异步复制下主库写完binlog就返回客户端成功,不管从库是否收到,主库宕机时会丢失未同步到从库的数据;半同步复制下主库写完binlog后,需要至少收到一个从库写入relaylog的ACK确认,才返回客户端成功,保证数据至少存在两个副本,大幅降低数据丢失的概率。并行复制是为了解决从库单SQL线程重放效率低、主从延迟大的问题:MySQL5.7支持基于组提交的并行复制,同一批次提交的事务可以在从库并行重放;MySQL8.0支持基于writeset的并行复制,只要事务修改的行没有冲突,就可以并行重放,同步效率提升数倍,基本可以消除主从延迟。2.请说明主从延迟的常见原因和解决方案答:主从延迟的常见原因包括:①主库并发写入量过高,从库重放速度跟不上;②从库硬件配置低于主库,CPU、IO性能不足;③从库存在大量慢查询,占用系统资源,影响重放速度;④主库执行大事务,比如一次性更新数十万行数据,从库重放该事务需要长时间阻塞后续操作;⑤未开启并行复制,从库单线程重放效率低。解决方案:①开启MySQL8.0的writeset并行复制,大幅提升从库重放速度;②主库大事务拆分为多个小事务执行,减少单次重放的时间;③从库硬件配置和主库保持一致,优先使用SSD存储;④优化从库慢查询,减少资源占用;⑤读写分离场景下,对实时性要求高的请求直接路由到主库,避免读取从库的旧数据;⑥采用MySQLInnoDBCluster、MGR等基于共识协议的高可用集群,保证数据一致性的同时降低同步延迟。性能调优篇1.请说明慢SQL的排查优化流程答:慢SQL优化遵循以下流程:①开启慢查询日志,设置`long_query_time=1`(根据业务需求调整),收集所有执行时间超过阈值的SQL;②使用explain分析慢SQL的执行计划,重点查看type字段是否为all(全表扫描)、key字段是否命中了预期的索引、rows字段扫描的行数是否过大、Extra字段是否存在`usingfilesort`(文件排序)、`usingtemporary`(临时表)等需要优化的标识;③针对未命中索引的场景,建立合适的联合索引,优先使用覆盖索引避免回表;④优化SQL语句:避免使用select*,只查询需要的字段;避免大表join,通过冗余字段减少join次数;优化limit分页,将`limit10000,10`改写为`whereid>10000limit10`,避免大offset扫描大量数据;⑤优化表结构:避免使用允许为NULL的字段,选择最小合适的字段类型,将大字段拆分到单独的扩展表,减少单表大小;⑥优化数据库参数:将`innodb_buffer_pool_size`设置为物理内存的50%-70%,提升索引和数据的缓存命中率;调整`innodb_log_file_size`到1G-4G,减少checkpoint的频率。2.线上数据库CPU占用100%的排查处理流程答:处理流程为:①首先通过top命令确认CPU高占用的进程是否为mysqld,排除其他进程的影响;②登录MySQL,执行`sho
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网商安全生产规范模拟考核试卷含答案
- 玻璃灯工岗前核心实操考核试卷含答案
- 味精微生物菌种工操作规范水平考核试卷含答案
- 淀粉糖制造工安全意识评优考核试卷含答案
- 提琴制作工安全文明测试考核试卷含答案
- 传声器装调工岗前安全宣传考核试卷含答案
- 紧固件螺纹成型工岗位新材料考核试卷含答案
- 燃气轮机值班员创新思维强化考核试卷含答案
- 数控等离子切割机操作工岗中基础安全考核试卷含答案
- 数控插工安全应急竞赛考核试卷含答案
- ISO 17987-7-2025 中文版 道路车辆 LIN 总线 物理层一致性测试规范
- 2026营销技巧面试题及答案
- 2026广东广州市南沙区黄阁镇人民政府招聘编外工作人员10人笔试参考题库及答案详解
- 2026年国防知识竞赛题库及答案(共80题)
- 河南省2026年中考数学试卷(含答案)
- 2026年广东省中考地理真题及答案解析
- 肿瘤患者的活动与运动指导
- T∕CCEAS008-2026 建设工程造价咨询成果文件质量标准
- 2026年国企风控岗笔试试题及答案
- 2026年上海市中考物理真题试题(含答案)
- 建筑装修甲醛控制技术指导手册
评论
0/150
提交评论