开往未来的列车|这是我见过最有用的Mysql面试题,面试了无数公司总结的( 四 )

  • 打宽表 , 一般而言 , 商户端对数据实时性要求并不是很高 , 比如查询订单列表 , 可以把订单表同步到离线(实时)数仓 , 再基于数仓去做成一张宽表 , 再基于其他如es提供查询服务 。
  • 数据量不是很大的话 , 比如后台的一些查询之类的 , 也可以通过多线程扫表 , 然后再聚合结果的方式来做 。 或者异步的形式也是可以的 。
  • List>> taskList = Lists.newArrayList();for (int shardingIndex = 0; shardingIndex < 1024; shardingIndex++) {taskList.add(() -> (userMapper.getProcessingAccountList(shardingIndex)));}List list = null;try {list = taskExecutor.executeTask(taskList);} catch (Exception e) {//do something}public class TaskExecutor {publicList executeTask(Collection tasks) throws Exception {List result = Lists.newArrayList();List futures = ExecutorUtil.invokeAll(tasks);for (Future future : futures) {result.add(future.get());}return result;}}12. 说说mysql主从同步怎么做的吧?首先先了解mysql主从同步的原理
    1. master提交完事务后 , 写入binlog
    2. slave连接到master , 获取binlog
    3. master创建dump线程 , 推送binglog到slave
    4. slave启动一个IO线程读取同步过来的master的binlog , 记录到relay log中继日志中
    5. slave再开启一个sql线程读取relay log事件并在slave执行 , 完成同步
    6. slave记录自己的binglog

    开往未来的列车|这是我见过最有用的Mysql面试题,面试了无数公司总结的由于mysql默认的复制方式是异步的 , 主库把日志发送给从库后不关心从库是否已经处理 , 这样会产生一个问题就是假设主库挂了 , 从库处理失败了 , 这时候从库升为主库后 , 日志就丢失了 。 由此产生两个概念 。
    全同步复制
    主库写入binlog后强制同步日志到从库 , 所有的从库都执行完成后才返回给客户端 , 但是很显然这个方式的话性能会受到严重影响 。
    半同步复制
    【开往未来的列车|这是我见过最有用的Mysql面试题,面试了无数公司总结的】和全同步不同的是 , 半同步复制的逻辑是这样 , 从库写入日志成功后返回ACK确认给主库 , 主库收到至少一个从库的确认就认为写操作完成 。
    13. 那主从的延迟怎么解决呢?这个问题貌似真的是个无解的问题 , 只能是说自己来判断了 , 需要走主库的强制走主库查询 。
    作者:科技缪缪原文链接:


    推荐阅读