上一篇
互联网公司刷数据库
- 行业动态
- 2025-04-24
- 1
互联网公司刷数据库通常指高频访问或改动数据,多用于数据采集、压力测试,但易引发法律风险及系统
SQL优化核心思路
避免全表扫描
- 优先使用索引字段作为查询条件
- 慎用
SELECT
,仅返回必要字段 - 示例:
SELECT id, name FROM user WHERE age > 30; -仅返回必要字段
合理使用索引
- 对高频查询字段建立索引(如WHERE/JOIN/ORDER BY条件)
- 复合索引遵循”最左前缀原则”
- 避免冗余索引(增加写入开销)
减少子查询
- 用JOIN替代IN/EXISTS子查询
- 示例对比:
-低效写法 SELECT FROM order WHERE user_id IN (SELECT id FROM user WHERE age > 30); -优化写法 SELECT o. FROM order o JOIN user u ON o.user_id = u.id WHERE u.age > 30;
限制数据量
- 使用
LIMIT
分页查询 - 通过时间范围/状态筛选缩小数据集
- 示例:
SELECT FROM log WHERE create_time > '2023-01-01' AND status = 1;
- 使用
索引设计规范
索引类型 | 适用场景 | 注意事项 |
---|---|---|
B+树索引 | 数值/字符串等单字段查询 | 避免过度使用(写性能下降) |
全文索引(FTS) | 模糊匹配 | 占用存储空间大 |
联合索引 | 多字段组合查询 | 遵循最左前缀原则 |
覆盖索引 | 查询字段全部包含在索引中 | 可避免回表操作 |
执行计划分析(EXPLAIN)
通过EXPLAIN
命令查看MySQL执行计划,重点关注:
- type:ALL(全表扫描)→ index(索引扫描)→ range(范围扫描)→ ref(非唯一索引)→ eq_ref(唯一索引)
- key:实际使用的索引
- rows:预估扫描行数
- Extra:出现”Using temporary”需优化去重操作,”Using filesort”需优化排序字段
事务与锁优化
事务设计原则
- 尽量缩短事务执行时间
- 避免大事务包含大量操作
- 示例:
START TRANSACTION; -仅包含必要操作 UPDATE account SET balance = balance 100 WHERE id = 1; UPDATE account SET balance = balance + 100 WHERE id = 2; COMMIT;
死锁预防
- 固定资源获取顺序
- 设置超时时间(
innodb_lock_wait_timeout
) - 示例:
SET innodb_lock_wait_timeout = 5; -5秒后自动回滚
分库分表实践
垂直拆分
- 按业务模块拆分(如用户表、订单表分离)
- 优点:简化单个库结构,提升并发能力
水平拆分
- 按哈希/范围拆分(如
user_$id%10
) - 关键问题解决:
| 问题 | 解决方案 |
|——————–|———————————|
| ID生成 | Snowflake算法/UUID |
| 跨库关联查询 | 通过中间表或应用层拼接 |
| 全局自增 | Google的AURORA方案/Redis集群 |
- 按哈希/范围拆分(如
缓存机制应用
缓存更新策略
- 写操作时同步更新缓存(Cache-Aside模式)
- 示例:
# 更新数据库后删除缓存 update_account_balance(user_id) del_cache(f"user_{user_id}")
热点数据预加载
- 使用Redis预热高频访问数据
- 示例:
# 提前加载热门商品信息到Redis redis-cli setobj product:12345 $(mysql_query "SELECT FROM product WHERE id=12345")
慢查询治理流程
抓取慢查询
- 开启
slow_query_log
并配置阈值(如2秒) - 定期分析
slow.log
文件
- 开启
优化步骤
- Step1: 定位执行频率最高的慢SQL
- Step2: 检查是否缺失索引/索引失效
- Step3: 重构SQL逻辑(如替换子查询)
- Step4: 验证优化效果(对比执行计划)
读写分离架构
主从复制配置
- 一主多从(常见1:2或1:3比例)
- 主库负责写操作,从库处理读请求
路由策略
- 强制走代理层(如MyCAT/ShardingSphere)
- 示例配置:
dataSources: master: jdbc:mysql://master-db:3306/test slave: jdbc:mysql://slave-db1:3306/test,jdbc:mysql://slave-db2:3306/test
数据库监控指标
指标分类 | 关键指标 | 阈值预警值 |
---|---|---|
连接层 | Threads_running | >最大连接数80% |
性能层 | QPS/TPS | 突发性毛刺 |
存储层 | Innodb_buffer_pool_usage | >95%持续1分钟 |
锁等待 | Semaphore_wait_time | >1秒/次 |
案例实战:电商订单表优化
原始表结构
CREATE TABLE `order` ( id BIGINT PRIMARY KEY, user_id BIGINT, shop_id BIGINT, status ENUM('pending','paid','shipped'), create_time DATETIME, total_amount DECIMAL(10,2) );
优化方案
索引优化
- 联合索引:
idx_user_shop_status(user_id,shop_id,status)
- 时间索引:
idx_create_time(create_time)
- 联合索引:
分区表设计
PARTITION BY RANGE(YEAR(create_time)) ( PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025) );
查询优化
-原始低效查询 SELECT FROM order WHERE user_id=123 AND create_time>'2023-01-01'; -优化后查询 SELECT id,user_id,shop_id,status,total_amount FROM order USE INDEX(idx_user_shop_status) WHERE user_id=123 AND create_time>'2023-01-01';
【相关问题与解答】
Q1:如何判断某个查询是否适合建立索引?
解答:
从以下维度评估:
- 查询频率:每天执行超过50次的查询建议考虑建索引
- 数据选择性:字段基数越大(如用户ID)效果越好,性别等低基数字段慎用
- IO成本:通过
COUNT(DISTINCT field)/TABLE_ROWS
计算选择性,值>0.1时收益明显 - 维护成本:频繁更新的字段(如状态位)需权衡写入开销
Q2:分库分表后如何保证数据一致性?
解答:
可采用以下方案:
- 分布式事务:基于XA协议(性能差)或TCC(Try-Confirm-Cancel)补偿机制
- 最终一致性:允许短时间数据不一致,通过异步对账修正(如支付场景)
- 唯一索引保障:在分库键上建立全局唯一索引(如用户ID),依赖数据库约束保证强一致