深信服开奖了,又一个劝退价。。。

科技   2024-11-11 14:00   广东  
点击关注公众号,SQL干货及时获取
后台回复:1024,获取500G视频教程
推荐阅读
转行成为数据分析师
牛逼,OpenAI新模型 o1 国内直接连!
《SQL145题第2版》正式发布!

大家好,我是岳哥。
最近深信服开奖了,不少拿到offer的同学在网上爆料,今年深信服的价格开的又是一个劝退价,拒了。(此前vivo开奖是个劝退价:vivo开奖了,劝退价。。。
这个价格对当事人可能确实是劝退价或者侮辱价,但是这些看多了,总觉得这些人是故意凡尔赛.在现在这环境下,23k的应届生怎么说都算得上是高薪了,毕竟还有好多0 offer,甚至毕业就是失业的应届生。
也不是酸吧,就是觉得很讨人嫌。
岳哥还是照例给大家总结一下今年深信服技术岗的开奖情况,给有需要的同学参考一下。
  • 白菜:17k~19k,(12~18薪),无签字费
  • SP:21k~24k,(12~18薪),签字费15w~20W(三年期)
  • SSP:27k~29k,(12~18薪),签字费25w ~ 30W(三年期)
SP 和 SSP 还是给的挺多的,整体也比前几年给的多,虽然还是比不上其他一线互联网大厂。另外,这个签字费是分三年发放,因此考虑到员工流动性,很多人是拿不满的。毕竟深信服的加班比较严重,很多人顶不住工作强度,干了不到一年就溜了。
回到正题,继续给大家分享一些常见的数据库面试题

题目列表

1、你在一个电商系统中发现了一个慢查询,执行时间超过3秒,请详细描述你会如何分析和优化这个问题?
2、假设你负责一个支付系统的数据库,平均每秒有1000笔交易写入,突然系统报警显示写入延迟超过500ms,你要如何处理?
3、如何设计一个千万级用户的社交网络数据库架构?
4、你如何规划和执行一个数据库从MySQL 5.7升级到MySQL 8.0的方案?
5、在一个订单系统中,发现有部分订单状态不一致:支付状态显示已支付,但账务系统显示未收到款项。请问如何定位和解决这个数据一致性问题?
6、设计一个大型电商平台的秒杀系统数据库方案,要求能支持10万人同时抢购一件商品。
7、生产环境的主从复制突然中断,从库报错 'Got fatal error 1236'。请问如何处理?
8、如何设计一个亿级用户的即时通讯系统的离线消息存储方案?

1、你在一个电商系统中发现了一个慢查询,执行时间超过3秒,请详细描述你会如何分析和优化这个问题?

这个问题考察实际问题的分析和解决能力。
首先,我会收集这个慢查询的具体信息:
  • 使用 EXPLAIN 分析SQL执行计划
  • 查看慢查询日志,了解SQL语句的完整执行情况
  • 确认SQL运行的时间段(是否在业务高峰期)
然后进行问题定位:
  • 如果发现没有用到索引,分析是否可以新建合适的索引
  • 如果是因为数据量太大,考虑是否需要分表
  • 如果是关联查询过多,考虑是否可以优化表结构
具体优化方案可能包括:
  • 优化SQL语句本身,比如去掉不必要的JOIN
  • 添加合适的索引
  • 如果是统计类查询,可以考虑引入数据冗余或使用统计表
  • 对于实时性要求不高的查询,可以加入缓存层
实施优化后:
  • 在测试环境验证优化效果
  • 评估对其他业务的影响
  • 制定回滚方案
  • 在低峰期进行上线

2、假设你负责一个支付系统的数据库,平均每秒有1000笔交易写入,突然系统报警显示写入延迟超过500ms,你要如何处理?

立即进行问题排查:
  • 检查系统资源使用情况(CPU、内存、IO)
  • 查看数据库连接数和当前活动事务
  • 检查是否有长事务或死锁
  • 查看主从复制状态
可能的原因分析:
  • 如果是CPU使用率突增,可能是有全表扫描的查询
  • 如果是IO等待高,可能是写入量突增导致
  • 如果是内存使用高,可能是缓冲池配置问题
短期解决方案:
  • 如果是单个查询导致,可以 kill 掉问题查询
  • 如果是连接数过高,可以适当限制应用连接数
  • 如果是死锁问题,可以手动解除死锁
长期优化方案:
  • 引入读写分离
  • 实施分库分表
  • 优化数据库参数配置
  • 完善监控系统

3、如何设计一个千万级用户的社交网络数据库架构?

需要考虑的核心问题:
  1. 数据特点:

  • 用户信息变更频率低但查询频繁
  • 关系数据量庞大且增长快
  • 消息数据实时性要求高
  • 具体设计方案:

  • -- 用户基础信息表
    CREATE TABLE user_base (
        user_id BIGINT PRIMARY KEY,
        nickname VARCHAR(32),
        avatar_url VARCHAR(256),
        status TINYINT,
        created_at TIMESTAMP,
        -- 其他基础信息
        INDEX idx_status(status)
    );

    -- 用户关系表(分表)
    CREATE TABLE user_relation_${分片号} (
        id BIGINT PRIMARY KEY,
        user_id BIGINT,
        follow_user_id BIGINT,
        relation_type TINYINT,
        created_at TIMESTAMP,
        INDEX idx_user_follow(user_id, follow_user_id)
    );

    -- 消息表(分表)
    CREATE TABLE user_message_${分片号} (
        message_id BIGINT PRIMARY KEY,
        sender_id BIGINT,
        receiver_id BIGINT,
        content TEXT,
        created_at TIMESTAMP,
        INDEX idx_receiver_time(receiver_id, created_at)
    );
    架构设计要点:
    • 用户表考虑按照用户ID范围分片
    • 关系表按用户ID取模分片
    • 消息表按时间范围分表
    • 引入Redis缓存热点数据
    • 使用图数据库优化关系查询
    • 考虑异地多活部署

    4、你如何规划和执行一个数据库从MySQL 5.7升级到MySQL 8.0的方案?

    升级准备:
    1. 影响评估

    • 评估停机时间
    • 识别不兼容特性
    • 评估应用改造工作
  • 升级方案制定:

    • 准备详细的升级步骤
    • 准备回滚方案
    • 准备验证方案
  • 具体执行步骤:

  • # 1. 在测试环境验证
    mysqldump -uroot -p --all-databases > backup.sql
    mysql_upgrade -uroot -p --force

    # 2. 生产环境升级
    # 2.1 备份数据
    mysqldump -uroot -p --all-databases > prod_backup.sql

    # 2.2 停机升级
    systemctl stop mysql
    # 安装新版本
    yum install mysql-8.0

    # 2.3 数据迁移
    mysql_upgrade -uroot -p --force

    # 2.4 验证
    mysql -V
    CHECK TABLE all_tables;
    关键考虑点:
    • 升级前必须做完整备份
    • 评估需要的停机时间
    • 准备详细的回滚方案
    • 升级后全面的功能验证

    5、在一个订单系统中,发现有部分订单状态不一致:支付状态显示已支付,但账务系统显示未收到款项。请问如何定位和解决这个数据一致性问题?

    1. 首先确认问题范围
    -- 查询不一致的订单数量和分布
    SELECT 
        DATE(create_time) as order_date,
        COUNT(*) as inconsistent_count
    FROM orders o
    LEFT JOIN payments p ON o.order_id = p.order_id
    WHERE o.status = 'PAID' 
    AND (p.status != 'SUCCESS' OR p.status IS NULL)
    GROUP BY DATE(create_time)
    ORDER BY order_date DESC;
    1. 定位可能的原因:
    • 支付回调处理失败
    • 事务处理异常
    • 数据库死锁导致回滚
    • 系统重启导致的数据丢失
    1. 数据修复方案:
    -- 创建临时表记录需要修复的订单
    CREATE TABLE fix_orders AS
    SELECT o.order_id, o.status as order_status, 
           p.status as payment_status
    FROM orders o
    LEFT JOIN payments p ON o.order_id = p.order_id
    WHERE o.status != p.status;

    -- 针对每种不一致情况进行处理
    UPDATE orders o
    INNER JOIN payments p ON o.order_id = p.order_id
    SET o.status = CASE 
        WHEN p.status = 'SUCCESS' THEN 'PAID'
        WHEN p.status = 'FAILED' THEN 'UNPAID'
        ELSE o.status
    END
    WHERE o.order_id IN (SELECT order_id FROM fix_orders);
    1. 长期解决方案:
    • 实现分布式事务
    • 增加状态校验任务
    • 完善监控告警
    • 引入消息队列确保可靠投递

    6、设计一个大型电商平台的秒杀系统数据库方案,要求能支持10万人同时抢购一件商品。

    1. 库表设计:
    -- 秒杀活动表
    CREATE TABLE seckill_activity (
        id BIGINT PRIMARY KEY,
        product_id BIGINT NOT NULL,
        title VARCHAR(64),
        stock_count INT NOT NULL,
        start_time TIMESTAMP,
        end_time TIMESTAMP,
        create_time TIMESTAMP,
        status TINYINT,
        INDEX idx_product(product_id),
        INDEX idx_time(start_time, end_time)
    ENGINE=InnoDB;

    -- 秒杀库存表(分表)
    CREATE TABLE seckill_stock_${分片号} (
        id BIGINT PRIMARY KEY,
        activity_id BIGINT,
        stock_count INT,
        locked_count INT,
        version BIGINT,
        INDEX idx_activity(activity_id)
    ENGINE=InnoDB;

    -- 秒杀订单表(分表)
    CREATE TABLE seckill_order_${分片号} (
        id BIGINT PRIMARY KEY,
        user_id BIGINT,
        activity_id BIGINT,
        product_id BIGINT,
        status TINYINT,
        create_time TIMESTAMP,
        INDEX idx_user_activity(user_id, activity_id)
    ENGINE=InnoDB;
    1. 关键技术方案:
    • 使用Redis预热商品库存
    • 采用乐观锁进行库存扣减
    • 使用分布式锁防止重复下单
    • 订单异步创建并通过消息队列投递
    1. 具体实现示例:
    // 库存扣减伪代码
    public boolean deductStock(Long activityId, Long userId) {
        // 1. Redis预减库存
        Long stock = redisTemplate.opsForValue()
            .decrement("seckill:stock:" + activityId);
        
        if (stock < 0) {
            return false;
        }
        
        try {
            // 2. 数据库乐观锁更新
            int updated = jdbcTemplate.update(
                "UPDATE seckill_stock SET " +
                "stock_count = stock_count - 1, " +
                "version = version + 1 " +
                "WHERE activity_id = ? AND stock_count > 0 " +
                "AND version = ?",
                activityId, version
            );
            
            if (updated > 0) {
                // 3. 异步创建订单
                orderMQProducer.sendMessage(
                    new OrderMessage(userId, activityId));
                return true;
            }
        } catch (Exception e) {
            // 4. 回滚Redis库存
            redisTemplate.opsForValue()
                .increment("seckill:stock:" + activityId);
        }
        return false;
    }

    7、生产环境的主从复制突然中断,从库报错 'Got fatal error 1236'。请问如何处理?

    1. 立即检查状态:
    -- 主库检查
    SHOW MASTER STATUS;
    SHOW BINARY LOGS;

    -- 从库检查
    SHOW SLAVE STATUS\G
    1. 确认问题原因:
    • binlog可能被主库清理
    • 网络连接中断
    • 磁盘空间不足
    • 从库执行了未同步的更新
    1. 修复流程:
    -- 1. 如果binlog丢失,需要重新搭建复制
    STOP SLAVE;
    RESET SLAVE;
    CHANGE MASTER TO 
        MASTER_LOG_FILE='mysql-bin.000xxx',
        MASTER_LOG_POS=xxxxx;
    START SLAVE;

    -- 2. 检查复制状态
    SHOW SLAVE STATUS\G

    -- 3. 验证数据一致性
    pt-table-checksum --nocheck-replication-filters \
        --replicate=test.checksums \
        --databases=mydb
    1. 预防措施:
    • 合理配置binlog保留时间
    • 监控主从延迟
    • 定期验证数据一致性
    • 实现自动故障转移

    8、如何设计一个亿级用户的即时通讯系统的离线消息存储方案?

    1. 分库分表策略:
    -- 按用户ID分库的消息表
    CREATE TABLE user_message_${库号}_${表号} (
        id BIGINT PRIMARY KEY,
        from_uid BIGINT,
        to_uid BIGINT,
        msg_type TINYINT,
        content TEXT,
        send_time TIMESTAMP,
        status TINYINT,
        INDEX idx_user_time(to_uid, send_time)
    ENGINE=InnoDB;

    -- 消息索引表
    CREATE TABLE message_index_${分片号} (
        id BIGINT PRIMARY KEY,
        user_id BIGINT,
        last_msg_id BIGINT,
        unread_count INT,
        INDEX idx_user(user_id)
    ENGINE=InnoDB;
    1. 存储方案设计:
    • 消息ID使用雪花算法生成
    • 消息内容考虑使用对象存储
    • 热数据使用Redis缓存
    • 冷数据定期归档
    1. 查询优化:
    -- 优化查询示例
    SELECT m.* 
    FROM user_message_1_1 m
    INNER JOIN message_index_1 i ON m.to_uid = i.user_id
    WHERE m.to_uid = ? 
    AND m.id < i.last_msg_id
    ORDER BY m.id DESC 
    LIMIT 20;
    1. 关键考虑点:
    • 消息必须有序
    • 支持消息撤回
    • 多终端同步
    • 历史消息搜索

    最后

    给大家推荐一下我们的GPT 4.0/4o/o1 preview系统,一次性买了200多个Plus会员放在这个系统的池子里,无需梯子即可直连,费用还比官网便宜一半,包售后。更多介绍点击这里每月仅需88元!
    我是岳哥,每天会分享一道SQL面试题并和大家聊聊近期的所见所闻
    欢迎关注,下期见~

    SQL数据库开发
    8年开发,5年管理,一个懂职场和AI的数据人。专注数据,Ai和职场等领域。回复「1024」,领取500G技术教程
     最新文章