当前位置:首页 > 行业动态 > 正文

互联网公司刷数据库

互联网公司刷数据库通常指高频访问或改动数据,多用于数据采集、压力测试,但易引发法律风险及系统

SQL优化核心思路

  1. 避免全表扫描

    • 优先使用索引字段作为查询条件
    • 慎用SELECT ,仅返回必要字段
    • 示例:
      SELECT id, name FROM user WHERE age > 30; -仅返回必要字段
  2. 合理使用索引

    • 对高频查询字段建立索引(如WHERE/JOIN/ORDER BY条件)
    • 复合索引遵循”最左前缀原则”
    • 避免冗余索引(增加写入开销)
  3. 减少子查询

    • 用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;
  4. 限制数据量

    • 使用LIMIT分页查询
    • 通过时间范围/状态筛选缩小数据集
    • 示例:
      SELECT  FROM log WHERE create_time > '2023-01-01' AND status = 1;

索引设计规范

索引类型 适用场景 注意事项
B+树索引 数值/字符串等单字段查询 避免过度使用(写性能下降)
全文索引(FTS) 模糊匹配 占用存储空间大
联合索引 多字段组合查询 遵循最左前缀原则
覆盖索引 查询字段全部包含在索引中 可避免回表操作

执行计划分析(EXPLAIN)

通过EXPLAIN命令查看MySQL执行计划,重点关注:

  1. type:ALL(全表扫描)→ index(索引扫描)→ range(范围扫描)→ ref(非唯一索引)→ eq_ref(唯一索引)
  2. key:实际使用的索引
  3. rows:预估扫描行数
  4. Extra:出现”Using temporary”需优化去重操作,”Using filesort”需优化排序字段

事务与锁优化

  1. 事务设计原则

    • 尽量缩短事务执行时间
    • 避免大事务包含大量操作
    • 示例:
      START TRANSACTION;
      -仅包含必要操作
      UPDATE account SET balance = balance 100 WHERE id = 1;
      UPDATE account SET balance = balance + 100 WHERE id = 2;
      COMMIT;
  2. 死锁预防

    • 固定资源获取顺序
    • 设置超时时间(innodb_lock_wait_timeout
    • 示例:
      SET innodb_lock_wait_timeout = 5; -5秒后自动回滚

分库分表实践

  1. 垂直拆分

    • 按业务模块拆分(如用户表、订单表分离)
    • 优点:简化单个库结构,提升并发能力
  2. 水平拆分

    • 按哈希/范围拆分(如user_$id%10
    • 关键问题解决:
      | 问题 | 解决方案 |
      |——————–|———————————|
      | ID生成 | Snowflake算法/UUID |
      | 跨库关联查询 | 通过中间表或应用层拼接 |
      | 全局自增 | Google的AURORA方案/Redis集群 |

缓存机制应用

  1. 缓存更新策略

    • 写操作时同步更新缓存(Cache-Aside模式)
    • 示例:
      # 更新数据库后删除缓存
      update_account_balance(user_id)
      del_cache(f"user_{user_id}")
  2. 热点数据预加载

    • 使用Redis预热高频访问数据
    • 示例:
      # 提前加载热门商品信息到Redis
      redis-cli setobj product:12345 $(mysql_query "SELECT  FROM product WHERE id=12345")

慢查询治理流程

  1. 抓取慢查询

    • 开启slow_query_log并配置阈值(如2秒)
    • 定期分析slow.log文件
  2. 优化步骤

    • Step1: 定位执行频率最高的慢SQL
    • Step2: 检查是否缺失索引/索引失效
    • Step3: 重构SQL逻辑(如替换子查询)
    • Step4: 验证优化效果(对比执行计划)

读写分离架构

  1. 主从复制配置

    • 一主多从(常见1:2或1:3比例)
    • 主库负责写操作,从库处理读请求
  2. 路由策略

    • 强制走代理层(如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)
);

优化方案

  1. 索引优化

    • 联合索引:idx_user_shop_status(user_id,shop_id,status)
    • 时间索引:idx_create_time(create_time)
  2. 分区表设计

    PARTITION BY RANGE(YEAR(create_time)) (
        PARTITION p2023 VALUES LESS THAN (2024),
        PARTITION p2024 VALUES LESS THAN (2025)
    );
  3. 查询优化

    -原始低效查询
    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:如何判断某个查询是否适合建立索引?

解答
从以下维度评估:

  1. 查询频率:每天执行超过50次的查询建议考虑建索引
  2. 数据选择性:字段基数越大(如用户ID)效果越好,性别等低基数字段慎用
  3. IO成本:通过COUNT(DISTINCT field)/TABLE_ROWS计算选择性,值>0.1时收益明显
  4. 维护成本:频繁更新的字段(如状态位)需权衡写入开销

Q2:分库分表后如何保证数据一致性?

解答
可采用以下方案:

  1. 分布式事务:基于XA协议(性能差)或TCC(Try-Confirm-Cancel)补偿机制
  2. 最终一致性:允许短时间数据不一致,通过异步对账修正(如支付场景)
  3. 唯一索引保障:在分库键上建立全局唯一索引(如用户ID),依赖数据库约束保证强一致
0