MySQL 误删数据后,用全量备份和 binlog 做时间点恢复的完整过程
记录一次靠 mysqldump 全量备份和 binlog 增量把数据恢复到指定时间点的操作,包含命令和踩坑。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-09-18 19:16:13 MySQL 索引优化 SQL调优
优化器偶尔会选错索引,尤其在数据分布变化或统计信息没更新的时候。这时候手写 SQL 的人就忍不住想给它指条路,于是就有了 FORCE INDEX 这类提示。但提示不是命令,用之前得把语法和边界搞清楚。
先看 FORCE INDEX。它的意思是强制优化器使用你指定的索引,即使它自己算出来另一个更划算。写法不复杂,单表查询里放在表名后面:
SELECT * FROM orders FORCE INDEX (idx_user_id) WHERE user_id = 100 AND order_date > '2023-01-01';
JOIN 查询里每个表后面都能加,之前见过有人在多表连接时只给一个表加强制,结果另一张表还是走全表,性能没改善,回头还得补。写法是这样:
SELECT * FROM table1 FORCE INDEX (index_name) JOIN table2 FORCE INDEX (index_name) ON table1.id = table2.id;
USE INDEX 就没有那么强硬,更像建议。优化器觉得不合适可以忽略。比如:
SELECT * FROM products USE INDEX (idx_product_category) WHERE category = 'Electronics' AND price < 1000;
实际线上我碰到过,加了 USE INDEX 之后执行计划没变,查了文档才知道这玩意儿只是倾向性提示,不是死命令。新手容易在这上面绕进去。
IGNORE INDEX 是反着来的,告诉优化器某个索引别用。有时候一个低选择性索引会拖慢查询,忽略它反而快。例子:
SELECT * FROM products IGNORE INDEX (idx_price) WHERE category = 'Electronics' AND price < 1000;
多索引选择可以同时给几个候选,让优化器在里面挑:
SELECT * FROM table_name USE INDEX (index1, index2) WHERE condition;
DML 语句也能用,UPDATE 和 DELETE 里同样加 FORCE INDEX:
UPDATE table_name FORCE INDEX (index_name) SET column1 = value1 WHERE condition;
DELETE FROM table_name FORCE INDEX (index_name) WHERE condition;
不过 UPDATE 里加强制索引要小心,因为修改操作本身也会影响索引维护,代价可能比查询还高。
几个容易忽略的地方。一是提示是建议性质,尤其 USE INDEX,优化器完全可能不听。二是强制不当索引会直接拖慢性能,我一开始以为 FORCE 就是包治百病,后来线上一个大表强行走了一个不适合的索引,扫描行数反而暴增。三是 MySQL 各版本对提示支持不一样,有些语法在 5.7 和 8.0 里行为有差别,升级之后最好重新验证。
四是索引有效性得持续监控,数据分布变了,原来好用的索引可能失效。
实践的时候我会用 EXPLAIN 对比加与不加提示的执行计划。两个 SQL 放在一起看 rows 和 key:
EXPLAIN SELECT * FROM orders WHERE user_id = 100 AND status = 'completed';
EXPLAIN SELECT * FROM orders FORCE INDEX (idx_user_status) WHERE user_id = 100 AND status = 'completed';
rows 差距一目了然。如果加了之后 rows 还是没降下来,基本就别用。
适用场景上,复杂 JOIN 查询里优化器容易算错连接顺序,强行指定某个索引能避免多表连接时的性能瓶颈。亿级大表处理时,全表扫描会要命,强制走一个窄索引能把查询时间从几十秒拉到几百毫秒。特定条件查询如果发现执行计划走了全表,也可以试试。
但一定要在测试环境验证,再上生产。生产监控这块,我们线上数据库跑在独立服务器,配合自动化部署和证书管理用 lcjmSSL 申请免费证书,API 全自动续期,不然证书过期会导致应用连不上数据库中间件,半夜报警很头疼。
常见问题里,索引选择错误用 FORCE INDEX 修正优化器决策;多索引竞争时用 USE INDEX 指定候选集让优化器少走弯路;索引失效可以用 IGNORE INDEX 排除掉拖后腿的;复杂查询就把表提示和 JOIN 顺序一起调。但别把强制索引当常规手段,先看看统计信息有没有更新,表结构有没有变化,很多时候问题不在 SQL 提示上。
差不多这些,强制索引是个工具,不是万能药。
记录一次靠 mysqldump 全量备份和 binlog 增量把数据恢复到指定时间点的操作,包含命令和踩坑。
整理 GROUP_CONCAT 排序、去重、分隔符和长度限制等实际使用细节。
从应急处理到长期修复,整理一次线上连接数打满的完整排查过程。
记录 datetime 字段定义、插入、格式化查询以及 Java 端类型映射、时区等问题,避免线上踩坑。
MySQL SSL配置失败让人抓狂?别担心,这篇文章手把手教你排查常见问题,让你轻松搞定数据库加密连接,更有自动化工具推荐哦!