Skip to content
目录概览

如何对大表进行优化?

  • 单表不拆分下的优化

    • 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
    • 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
    • 缓存: 使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;
  • 分库分表

    • 垂直拆分:根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。

      简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。 如下图所示:

      c1c2c3c4c5c6c7c8c9c10
      拆分为:
      c1c2c3c4
      -----
      c1c5c6c7c8c9c10
      • 垂直拆分的优点
        • 行数据变小;
        • 减少读取的Block数;
        • 减少I/O次数;
        • 简化表的结构;
        • 易于维护。
      • 垂直拆分的缺点
        • 主键会出现冗余;
        • 需要管理冗余列;
        • 会引起Join操作;
        • 让事务变得更加复杂。
    • 水平拆分 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量。

      水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。如下示例: 200W数据

      c1c2c3c4c5c6c7c8c9c10

      拆分为两个100W 100W表A

      c1c2c3c4c5c6c7c8c9c10
      100W表B
      c1c2c3c4c5c6c7c8c9c10
      ----------

      水品拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以 水平拆分最好分库