MySQL 是后端开发最常用的关系型数据库之一,也是数据库面试中最容易追问到底的专题。学习 MySQL 时,建议围绕“索引怎么让查询变快、事务怎么保证一致性、日志怎么保证恢复和复制、执行计划怎么定位慢 SQL”这几条主线展开。
适合谁看
- 想系统学习 MySQL 原理和性能优化的后端开发者。
- 准备 MySQL 索引、事务、MVCC、日志、执行计划相关面试题的同学。
- 已经能写常规 SQL,但对慢 SQL 分析、索引设计和事务问题不够熟的读者。
- 需要在项目中处理 MySQL 性能、数据一致性和字段设计问题的工程师。
原文地址:https://shockerli.net/post/1000-line-mysql-note/ ,JavaGuide 对本文进行了简答排版,新增了目录。
非常不错的总结,强烈建议保存下来,需要的时候看一看。
基本操作
/* Windows服务 */
-- 启动 MySQL
net start mysql
-- 创建Windows服务
sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格)
/* 连接与断开服务器 */
-- 连接 MySQL
mysql -h 地址 -P 端口 -u 用户名 -p 密码
-- 显示哪些线程正在运行
SHOW PROCESSLIST
-- 显示系统变量信息
SHOW VARIABLES
本文来自木木匠投稿。
本篇文章会分析下一个 SQL 语句在 MySQL 中的执行流程,包括 SQL 的查询在 MySQL 内部会怎么流转,SQL 语句的更新是怎么完成的。
在分析之前我会先带着你看看 MySQL 的基础架构,知道了 MySQL 由那些组件组成以及这些组件的作用是什么,可以帮助我们理解和解决这些问题。
一 MySQL 基础架构分析
本次测试使用的 MySQL 版本是
5.7.26,随着 MySQL 版本的更新某些特性可能会发生改变,本文不代表所述观点和结论于 MySQL 所有版本均准确无误,版本差异请自行甄别。
多版本并发控制 (Multi-Version Concurrency Control)
MVCC 是一种并发控制机制,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。它是通过在每个数据行上维护多个版本的数据来实现的。当一个事务对数据进行修改时,InnoDB 会直接更新当前数据行(原地更新),并将旧版本数据保存到 Undo Log 中。其他事务在进行快照读(Snapshot Read)时,会根据 ReadView 和 Undo Log 中的版本链,读取到该数据在某一时刻的一致性视图,从而避免读操作被写操作阻塞。
作者:飞天小牛肉
众所周知,自增主键可以让聚集索引尽量地保持递增顺序插入,避免了随机查询,从而提高了查询效率。
但实际上,MySQL 的自增主键并不能保证一定是连续递增的。
作者: 听风 原文地址: https://www.cnblogs.com/huchong/p/10219318.html。
JavaGuide 已获得作者授权,并对原文内容进行了完善补充。
数据库命名规范
- 所有数据库对象名称必须使用小写字母并用下划线分割。
- 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)。
- 数据库对象的命名要能做到见名识义,并且最好不要超过 32 个字符。
- 临时库表必须以
tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期 (时间戳) 为后缀。 - 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)。
在数据库性能优化中,索引是最直接有效的优化手段之一。然而,建了索引并不等于一定能用上索引。实际开发中,我们经常遇到这样的困惑:明明在字段上建立了索引,查询却依然慢如蜗牛,通过 EXPLAIN 分析发现居然是全表扫描。
导致索引失效的原因多种多样,既有 SQL 语句写法问题,也有索引设计不当的因素。有些失效场景是显性的(如违背最左前缀原则),有些则非常隐蔽(如隐式类型转换)。如果不深入了解这些失效场景,很容易在生产环境中埋下性能隐患。
本文将系统总结 MySQL 索引失效的常见场景,分析失效背后的原理机制,并提供相应的优化建议,帮助你在日常开发和排查问题中快速定位并解决索引失效问题。
感谢WT-AHA对本文的完善,相关 PR:https://github.com/Snailclimb/JavaGuide/pull/1648 。
但凡经历过几场面试的小伙伴,应该都清楚,数据库索引这个知识点在面试中出现的频率高到离谱。
