跳至正文
来两杯美式
返回

MySQL 知识系列(六):SQL 注入、版本特性与容量评估

By 来两杯美式
发布于

SQL 注入

攻击原理

用户在表单或 URL 输入恶意的 SQL 片段,例如:

用户名: abcd' OR 1=1;--
密码: 1234

拼出的 SQL 变成:

SELECT * FROM t_student
WHERE NAME = 'abcd' OR 1=1;-- ' AND PASSWORD = '1234';

-- 之后都被注释,OR 1=1 让条件恒为真,绕过密码验证

防护:PreparedStatement(参数化查询)

原理:SQL 语句不再”先拼接再编译”,而是先发到 MySQL 预编译,再回传参数。用户提交的内容被解析为”值”,不会参与 SQL 拼接。

// JDBC 正确写法
String sql = "SELECT * FROM user WHERE name = ? AND pwd = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();

MyBatis 中的两个语法

<!-- #{} 使用 PreparedStatement(推荐,防注入) -->
<select id="findByName" resultType="User">
  SELECT * FROM user WHERE name = #{name}
</select>

<!-- ${} 直接拼接 SQL(不防注入,仅用于动态表名/列名) -->
<select id="findByTable" resultType="User">
  SELECT * FROM ${tableName} ORDER BY ${column}
</select>
写法防注入使用场景
#{xxx}99% 场景,参数值
${xxx}动态表名/列名(FROM 后、ORDER BY 后)

⚠️ ${} 在拼接用户输入的字段/表名时必须做白名单校验,否则就是 SQL 注入漏洞。

MySQL 8.0 新特性

服务器功能

用户和安全

InnoDB

三大发行版对比

维度MySQL 官方版Percona MySQLMariaDB
引擎InnoDBXtraDB(XtraDB 完全兼容 InnoDB)XtraDB(5.5 起)
兼容性官方基线与 MySQL 完全兼容与 MySQL 大部分兼容
监控工具社区版不提供(仅企业版有)Percona Monitor(免费)Monyog
主从复制基于日志点 + GTID + MGR基于日志点 + GTID + PXC基于日志点 + GTID + Galera Cluster
高可用集群MGR(多主)MGR + PXCGalera Cluster(PXC 风格)
最新版本跟进最快略落后较激进
来源Oracle 维护Percona 公司维护MySQL 创始人在 Oracle 收购后另起炉灶

选型建议

⚠️ 坑点:MariaDB 的 GTID 日志格式与 MySQL 不兼容不能作为 MySQL 的从库(反之可以)。

版本升级方法论

Step 1:分析升级收益

Step 2:分析升级风险

Step 3:制定方案

1. 评估受影响的业务系统
2. 制定详细的升级步骤
3. 备份数据库(mysqldump + 物理备份)
4. 升级 Slave → 主从切换 → 升级原主
5. 制定回滚方案(出问题能切回)

Step 4:执行(推荐流程)

1. 升级从库 1 → 验证无问题
2. 升级从库 2 → 验证无问题
3. 手动主从切换(让从库 1 变主)
4. 升级原主
5. 持续观察 24~48h

数据类型选型

字符串

CHAR(10)     -- 定长,最多 255 字符
VARCHAR(255) -- 变长,除内容外多 1~2 字节存长度
场景推荐
长度固定(身份证号、MD5)CHAR
长度差异大(昵称、地址)VARCHAR

时间

类型存储范围时区字节
DATETIME与时区无关1000-01-01 ~ 9999-12-318
TIMESTAMP时间戳(1970 起秒数)1970-01-01 ~ 2038-01-19依赖时区4

⚠️ TIMESTAMP 的 2038 问题:4 字节秒数将在 2038-01-19 溢出,建议新业务统一用 DATETIME

全文索引

ALTER TABLE t_article ADD FULLTEXT INDEX ft_title (title);

SELECT * FROM t_article WHERE MATCH(title) AGAINST('小米');

为什么生产环境不推荐用 MySQL 全文索引

  1. 中文分词差:词结果太多且不准确,占用大量存储
  2. 不实时更新:字段内容改了,全文索引不更新,需定期重建
  3. 集群中维护成本高:主从同步全文索引很麻烦
  4. 准确率低:不如专业搜索引擎

替代方案

更优秀的数据库

如果业务场景允许,可以考虑更现代的数据库:

数据库优势集群方案
PostgreSQL开源、稳定、功能强大(JSONB、GIS、CTE 完整)Postgres-XL(OLTP)、GreenPlum(OLAP)

PostgreSQL 近年发展极快,在 SQL 标准兼容性、复杂查询优化上普遍优于 MySQL。但 MySQL 的生态(运维工具、ORM 支持、问题排查资料)仍占优势。

写在最后

整个 MySQL 知识系列从架构→索引→锁→日志→事务→实战,覆盖了 DBA 和后端开发日常需要的核心知识。再看一组真实生产环境的 QPS/TPS 监控截图(单机 64 核 512G 内存,峰值 QPS 37 万、TPS 5 万):

单实例 QPS TPS 监控(峰值 37万 QPS / 5万 TPS)

能否扛住这种量级,依赖的正是这一系列文章所讲的:

希望对你有所帮助。


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
所属专题
MySQL
第 6 / 9 篇
查看系列全部文章
  1. 01.MySQL 知识系列(一):整体架构与存储引擎
  2. 02.MySQL 知识系列(二):索引结构与查询原理
  3. 03.MySQL 知识系列(三):锁机制与并发控制
  4. 04.MySQL 知识系列(四):日志系统:redo log、undo log、binlog
  5. 05.MySQL 知识系列(五):隔离级别、Spring 事务与查询流程
  6. 06.MySQL 知识系列(六):SQL 注入、版本特性与容量评估
  7. 07.MySQL 知识系列(七):SQL 调优(一)—— EXPLAIN 执行计划
  8. 08.MySQL 知识系列(八):SQL 调优(二)—— 索引设计与调优工具
  9. 09.MySQL 知识系列(九):CASE 语句、乐观锁与悲观锁实战

上一篇
Redis 知识系列(四):集群与缓存架构
下一篇
Redis 知识系列(三):持久化与高可用