MySQL常见面试题
文章平均质量分 85
收集整理关于MySQL的常见面试题
Lisonseekpan
任职于一家知名外企,java web开发工程师。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UUID vs 自增ID做主键,哪个好?
UUID与自增ID的核心差异在于:自增ID(4-8字节)具有存储紧凑、插入高效、索引友好等优势,适合单体高吞吐应用;而UUID(16字节)具有全局唯一性,适合分布式系统和需要前端生成ID的场景。性能测试显示自增ID插入速度比UUID快2-3倍,因其避免了B+树页分裂。实际应用中,单体系统推荐自增ID,分布式系统推荐UUID,混合方案则可结合两者优势。有序UUID(如UUIDv7)能部分解决性能问题,是折中选择。原创 2025-12-22 22:18:27 · 868 阅读 · 0 评论 -
为什么要避免使用 `SELECT *`?
避免使用SELECT *查询数据库,因其存在性能、安全性和可维护性问题。它会不必要地增加网络传输、内存占用和CPU开销,无法利用覆盖索引优化查询,且可能暴露敏感字段。表结构变更时易导致兼容性问题,降低代码可读性。建议显式列出所需字段或使用视图封装,仅在调试等特殊场景谨慎使用SELECT *。明确指定字段可提升查询效率、系统稳定性和代码质量。原创 2025-10-28 22:52:48 · 546 阅读 · 0 评论 -
SQL中的JOIN该如何优化
数据库JOIN操作优化指南(145字) JOIN操作是数据库查询的核心,优化需多维度策略:1)优先使用INNER JOIN,避免LEFT JOIN导致数据膨胀;2)遵循"小表驱动大表"原则优化连接顺序;3)为JOIN列创建复合索引,包含WHERE和SELECT字段;4)通过执行计划分析避免临时表和文件排序;5)大数据量时采用分区表或分库分表;6)调整数据库参数如join_buffer_size。典型优化案例显示,合理索引+SQL重写可将5秒查询降至0.1秒,扫描行数减少99%。建议结合E原创 2025-10-28 22:47:43 · 950 阅读 · 0 评论 -
索引失效的问题如何排查?
索引失效问题排查指南摘要 索引失效是数据库性能优化的常见问题,本文提供了一套完整的排查方法和解决方案。主要内容包括: 诊断工具:使用EXPLAIN分析执行计划,查看索引使用统计 10大常见原因: 数据类型不匹配 索引列使用函数 前导通配符查询 OR条件不当使用 复合索引顺序错误 解决方案: 确保查询条件与索引类型一致 避免在索引列使用函数 合理设计复合索引顺序 使用UNION替代部分OR查询 高级技巧:优化器跟踪、索引有效性测试、碎片检查 最佳实践:遵循最左前缀原则,选择高基数列,利用覆盖索引 通过系统化的原创 2025-10-23 21:44:16 · 939 阅读 · 0 评论 -
慢SQL的问题如何排查?
慢SQL排查全流程指南,涵盖定位、分析与优化方案。通过开启慢查询日志、EXPLAIN分析执行计划,重点检查全表扫描、索引失效等问题。提供索引设计策略、SQL改写技巧(如分页优化)、系统参数调优建议。针对复杂场景给出分库分表、缓存等架构方案,并推荐各数据库的诊断工具链。最后形成"分析-优化-验证"闭环流程,解决90%慢SQL问题。关键要遵循先执行计划分析,再索引优化,最后架构调整的优化顺序,并建立持续监控机制。原创 2025-10-23 21:34:57 · 915 阅读 · 0 评论 -
如何进行SQL调优?
本文系统介绍了SQL调优的全流程方法论,包括核心原则、优化步骤和实战案例。主要内容涵盖:1) 通过慢查询日志和执行计划定位性能瓶颈;2) 索引优化策略如复合索引设计和覆盖索引;3) SQL语句重写技巧;4) 数据库配置调优;5) 常用工具和常见错误。强调数据驱动决策和持续优化理念,提出"80%性能问题由20%慢SQL造成"的关键原则,并提供订单查询优化的完整案例对比。文章指出SQL调优需要结合业务场景,平衡读写性能,是一个需要持续迭代的过程。原创 2025-09-09 21:57:06 · 930 阅读 · 0 评论 -
MySQL查询limit 0,100和limit 10000000,100有什么区别?
LIMIT分页查询的性能差异主要取决于OFFSET值的大小。LIMIT 0,100直接返回前100条记录,执行快速;而LIMIT 10000000,100需要先扫描并跳过1000万条记录,性能极差且资源消耗巨大。深度分页时应避免大OFFSET,推荐使用基于游标的优化方法,记录上一页最后位置作为下次查询条件,利用索引快速定位。理解这一原理对于优化数据库查询至关重要。原创 2025-09-02 23:08:18 · 617 阅读 · 0 评论 -
一道MySQL笔试题: 输出 100 以内质数
MySQL生成100以内质数的主要方法包括存储过程和纯SQL查询。存储过程法通过嵌套循环检查每个数字是否为质数;纯SQL法使用递归CTE生成数字序列并筛选质数。两种方法结果相同:"2&3&5...97"。存储过程更灵活清晰但需创建权限,SQL查询无需额外对象但较复杂。对于小范围(100以内)质数生成,两种方法性能相当,可根据MySQL版本和需求选择。原创 2025-08-25 23:12:42 · 319 阅读 · 0 评论 -
MySQL 行转列与列转行的实现方式
MySQL提供了多种行列转换方法实现数据透视操作。行转列(Pivot)常用CASE WHEN/IF+聚合函数,适用于固定列名情况;动态SQL可处理不确定列名;列转行(Unpivot)则通过UNION ALL或MySQL 8.0+的CROSS JOIN实现。MySQL 5.7+还支持JSON函数处理复杂转换。根据数据特点、版本和性能需求,可选择CASE WHEN/UNION ALL(简单通用)、动态SQL(灵活)、CROSS JOIN(简洁)或JSON(复杂结构)等不同方案。固定列名场景推荐CASE WHEN原创 2025-08-25 23:03:51 · 795 阅读 · 0 评论 -
如何查看MySQL 的执行计划?
MySQL 执行计划(EXPLAIN)是SQL性能调优的关键工具,通过分析查询的执行路径和策略来优化性能。主要字段包括:type(访问类型,从最优system到最差ALL)、key(实际使用索引)、rows(预估扫描行数)和Extra(额外信息如Using index/Using filesort)。通过EXPLAIN命令可获取执行计划,重点解读type判断查询效率,分析Extra发现优化点(如避免全表扫描、利用覆盖索引)。实战中需关注索引使用情况,通过建立合理复合索引来优化查询,消除Using files原创 2025-08-23 15:28:52 · 1411 阅读 · 0 评论 -
什么是Mysql“最左前缀匹配”原则?
最左前缀匹配原则是MySQL等数据库使用联合索引的关键规则。它要求查询条件必须包含联合索引最左边的列,才能有效利用索引。联合索引(如(name, age, position))在B+树中按定义顺序排序,若跳过最左列(如仅用age),索引将失效。该原则本质是利用B+树的有序性避免全表扫描。设计索引时应将高频查询、高区分度列放左边,编写SQL时需确保WHERE条件命中最左前缀。理解这一原则对数据库优化至关重要。原创 2025-08-23 11:10:49 · 794 阅读 · 0 评论 -
InnoDB为什么使用B+树实现索引?
InnoDB选择B+树作为索引结构,是经过多维度权衡后的最优解。相比哈希表、二叉树等结构,B+树能最大限度减少磁盘I/O:其"矮胖"特性使十亿级数据只需2-3次I/O;叶子节点链表支持高效范围查询;所有查询路径等长确保稳定性能;非叶子节点不存数据提升缓存效率;双向链表便于全表扫描。B+树在点查、范围查、排序等场景均表现优异,完美适配数据库的磁盘I/O特性,是平衡性能与功能的最佳选择。原创 2025-08-19 22:57:18 · 673 阅读 · 0 评论 -
如何理解关系型数据库的ACID?
特性中文核心保证类比Atomicity原子性事务的不可分割性所有步骤是一个整体,成败与共Consistency一致性数据的完整性约束转账前后,总金额不变Isolation隔离性并发事务的可见性多个窗口排队,互不插队干扰Durability持久性数据的永久保存操作成功,结果入档,永不丢失简单来说,ACID 就是数据库对你做出的一个庄严承诺。原创 2025-08-19 22:37:15 · 973 阅读 · 0 评论 -
关系型数据库与非关系型数据库
关系型数据库与非关系型数据库是现代数据存储的两大核心范式。关系型数据库(RDBMS)采用表结构,支持ACID事务和复杂SQL查询,适合金融交易等强一致性场景;非关系型数据库(NoSQL)提供灵活的数据模型(键值/文档/图/列存储),支持水平扩展和最终一致性,适合实时分析、社交网络等高并发场景。两者各有优劣,实际应用中常采用混合架构,如核心业务用PostgreSQL、缓存用Redis、推荐系统用Neo4j等。选型需综合考虑业务需求、数据规模和一致性要求等因素。原创 2025-08-18 22:19:53 · 908 阅读 · 0 评论 -
什么是回表?
MySQL回表(Bookmark Lookup)是当查询无法通过索引获取全部数据时,需要回到主键索引二次查询的过程,会显著降低查询性能。核心问题包括I/O放大、随机磁盘访问和CPU开销增加。典型场景如SELECT *查询、UPDATE/DELETE操作等。优化方案包括使用覆盖索引(将查询字段全部放入索引)、强制使用主键、索引下推(提前过滤数据)等。通过EXPLAIN分析执行计划可识别回表现象,避免回表可使查询速度提升10-100倍。关键优化原则包括禁止SELECT *、设计覆盖索引、定期优化索引结构等。原创 2025-08-17 16:48:30 · 927 阅读 · 0 评论 -
什么是索引覆盖与索引下推?
MySQL索引优化技术:索引覆盖与索引下推对比分析 索引覆盖和索引下推是MySQL两大核心优化技术,通过不同方式提升查询性能。索引覆盖通过直接从索引获取数据避免回表,适用于SELECT字段全在索引中的场景;索引下推则允许存储引擎提前过滤非前缀列条件,减少回表数据量。两者可协同使用,如联合索引查询中同时应用ICP和覆盖索引,实现性能倍增。测试显示,在百万级数据中,单独使用索引覆盖或ICP可降低50%-70%查询时间,二者结合可减少90%以上执行时间。优化要点包括合理设计联合索引字段顺序、避免SELECT *、原创 2025-08-17 15:36:24 · 1266 阅读 · 0 评论 -
设计索引的原则有哪些?
MySQL索引设计需平衡查询性能与存储成本,遵循10大核心原则:高频查询优先、高区分度优先、最左前缀匹配;选择短字段、整型优于字符型、避免NULL列;根据场景选择B+Tree、FULLTEXT等索引类型。联合索引设计需按查询频率×区分度排序,优先使用覆盖索引。常见错误包括盲目建索引、冗余索引等,可通过慢查询日志优化。高级技巧如索引下推(ICP)能提升查询效率。定期监控索引使用率并进行碎片整理,遵循必要性、左前缀等黄金准则,可显著提升数据库性能。原创 2025-08-16 16:17:40 · 963 阅读 · 0 评论 -
Mysql一条sql语句的执行过程是怎样的?
MySQL执行SQL语句过程分为连接层、SQL处理层和存储引擎层:1)连接层验证权限建立通信;2)SQL处理层通过解析器、优化器生成执行计划;3)存储引擎层(如InnoDB)通过缓冲池和索引访问数据。关键优化点包括合理使用索引、控制事务大小和配置内存参数。全流程涉及语法解析、成本优化、数据读写等环节,性能瓶颈常出现在全表扫描、锁竞争和缓冲池不足等情况。原创 2025-08-16 00:19:35 · 932 阅读 · 0 评论 -
InnoDB如何解决脏读、不可重复读和幻读的?
InnoDB引擎通过MVCC和临键锁机制解决并发问题:MVCC使用ReadView机制避免脏读,通过一致性快照防止不可重复读;临键锁结合记录锁和间隙锁彻底解决幻读。REPEATABLE READ级别下,MVCC实现快照读保证可重复读,临键锁在写操作时锁定范围防止幻读。不同隔离级别下行为差异明显,默认REPEATABLE READ能平衡并发与一致性。实际应用中需注意写操作仍基于最新数据,显式加锁会跳过MVCC,间隙锁可能引发死锁。这套机制使InnoDB在保证高并发的同时实现强一致性。原创 2025-08-13 23:25:55 · 1327 阅读 · 0 评论 -
什么是脏读、幻读、不可重复读?
数据库事务隔离级别中的脏读、幻读和不可重复读是并发控制的核心问题。脏读指读取到未提交的数据,幻读指同一事务内多次范围查询结果集数量变化,不可重复读指同一数据多次读取结果不一致。不同隔离级别通过锁机制或MVCC解决这些问题:读已提交可防脏读,可重复读可防脏读和不可重复读,串行化可解决所有问题但性能最差。实际开发需根据业务需求选择合适隔离级别,通常在性能与一致性间取得平衡。不同数据库实现细节可能有所差异。原创 2025-08-13 21:39:35 · 809 阅读 · 0 评论 -
binlog、redolog和undolog区别?
MySQL中的binlog、redolog和undolog是保障数据一致性和事务安全的核心日志。binlog是Server层逻辑日志,用于主从复制和数据恢复;redolog是InnoDB物理日志,通过WAL机制实现崩溃恢复;undolog记录数据旧版本,支持事务回滚和MVCC。三者在事务提交时通过两阶段提交(2PC)协同工作:先写入redolog(prepare状态),再写入binlog,最后提交redolog(commit状态),确保数据一致性。性能调优需关注日志刷盘策略和空间管理,三者分别对应"原创 2025-08-10 14:49:00 · 671 阅读 · 0 评论 -
什么是聚簇索引和非聚簇索引?
聚簇索引和非聚簇索引的核心区别在于数据存储方式。聚簇索引的叶子节点直接存储行数据(如InnoDB主键索引),数据按索引顺序物理存储,范围查询高效但表只能有一个。非聚簇索引叶子节点存储主键值(如普通索引),查询非索引字段需回表,但可建多个。优化关键是避免回表,如使用覆盖索引。MyISAM则采用非聚簇索引存储行地址。理解差异对索引设计至关重要。原创 2025-08-10 11:05:55 · 488 阅读 · 0 评论 -
为什么Mysql不建议使用多表join查询?
MySQL 生产环境通常规避 JOIN 查询,主要因为性能、扩展性和维护性问题。大表 JOIN 会产生巨大计算量,分库分表后跨节点 JOIN 效率极低,复杂 JOIN 还容易导致执行计划不稳定。替代方案包括:程序层分步查询(先查主表再用 IN 查询关联表)、冗余关联字段、使用物化视图/宽表等。适用场景建议:小表 JOIN 可用,大表 JOIN 需禁止,分库分表场景完全避免 JOIN。核心原则是优先单表查询、程序层关联和适当冗余。原创 2025-08-09 16:02:01 · 680 阅读 · 0 评论 -
InnoDB为什么使用B+树实现索引?
B+树是数据库索引的理想结构,相比哈希表、二叉树和B树具有显著优势。其核心特点是非叶子节点仅存储索引,使树更矮胖,减少磁盘I/O(3层可支持17亿数据);叶子节点通过双向链表连接,实现高效范围查询。此外,B+树查询稳定、全表扫描更快,完美适配磁盘特性和数据库需求。总结来说,B+树通过优化存储结构和遍历方式,在等值查询、范围查询和I/O效率上均表现优异,成为InnoDB等数据库的首选索引方案。原创 2025-08-09 15:52:17 · 899 阅读 · 0 评论 -
MVCC的底层实现原理是什么?
MVCC通过数据版本链和Read View实现并发控制,核心组件包括Undo Log存储历史版本和Read View判断可见性。不同隔离级别下Read View生成时机不同:读已提交每次快照读生成新视图,可重复读复用首次视图。快照读无锁访问历史版本,当前读加锁获取最新数据。系统通过Purge线程清理不再需要的旧版本数据。MVCC机制实现了事务隔离与无锁并发读取的平衡。原创 2025-08-07 23:45:20 · 1094 阅读 · 0 评论 -
什么是MVCC
MVCC(多版本并发控制)是一种数据库技术,通过数据版本化解决并发读写冲突。它允许读操作不阻塞写操作,反之亦然,每个事务看到的是启动时的数据快照。MVCC通过创建数据版本链(如V0、V1)实现:读取时访问对应版本,修改时创建新版本,旧版本由垃圾回收清理。这种机制显著提高了并发性能,确保事务隔离性,避免脏读,适用于高并发场景如电商系统,开发者无需手动处理锁机制。核心在于版本快照、事务时间戳和读一致性。原创 2025-08-07 23:13:39 · 323 阅读 · 0 评论 -
[SELECT *] 和[SELECT 全部字段]有何优缺点?
SQL查询中,SELECT *和显式列出字段各有优劣。SELECT *编写简单,自动包含新增列,但会降低性能、增加安全风险、降低可读性。显式列出字段能优化性能、提高安全性,但编写繁琐。建议生产环境优先使用显式字段,仅在临时查询时用SELECT *。案例显示,电商平台改用显式字段后查询响应时间减少30%,同时避免了数据泄露风险。总体原则是:开发中优先指定具体字段,快速原型开发时可使用SELECT *。原创 2025-08-06 23:53:06 · 575 阅读 · 0 评论 -
数据库表设计时,字段你会如何选择?
本文总结了数据库表设计的核心原则和优化策略。在数据类型选择上,建议优先使用精确类型(如TINYINT代替INT),控制字符长度,慎用大字段。强调约束完整性的重要性,包括主键、唯一键、默认值等设置。针对特殊字段,介绍了JSON类型的使用场景和索引策略。文章还提供了电商订单系统的设计示例,展示如何应用这些原则。关键建议包括:选择最小够用数据类型、避免NULL字段、建立合适索引、使用UTF8MB4字符集等,这些措施能有效提升数据库性能和可维护性。原创 2025-08-06 23:40:14 · 176 阅读 · 0 评论 -
MySQL里记录货币用什么字段类型好?
摘要:MySQL存储货币金额推荐使用DECIMAL类型,因其为定点数可避免浮点数误差。语法为DECIMAL(M,D),M为总位数,D为小数位。相比FLOAT/DOUBLE(有精度问题)和INT(需代码转换),DECIMAL能确保精确计算。建议统一精度(如DECIMAL(15,2)),超大金额可考虑用BIGINT存储分单位。金融系统应优先保证精确性而非性能。原创 2025-08-05 22:14:59 · 501 阅读 · 0 评论 -
MyISAM和InnoDB的区别是什么?
摘要:MyISAM和InnoDB是MySQL两大存储引擎,主要区别包括:InnoDB支持事务、行级锁和外键,适合高并发写入和需要数据完整性的场景;MyISAM仅支持表级锁,无事务功能,但读取性能高,适合读密集型简单应用。InnoDB具备崩溃恢复能力,而MyISAM较弱。现代MySQL版本默认推荐使用更全面的InnoDB引擎。原创 2025-08-05 22:09:01 · 1038 阅读 · 0 评论
分享