数据库大表优化
我使用的sqlserver 做的是工业物联网数据, 几台设备,每台设备一秒一条数据, 数据量没有几天数据就达到好几百万, 查询效率非常低, 很快我就想到了分表
- 分表, 通过时间分表, 相当于把一年的数据放入一个表, 一年的表虽然很大, 但是都是一些历史数据, 存档表, 我手动创建了未来几年的几张表, 然后通过定时
任务, 每年的年底创建明年的表 - 现在数据表非常大, 已经严重影响到了数据查询, 所以我临时建了一个临时历史表, 先把数据表的旧数据转移过来
- 数据表大概有九千多万的数据, 索引忘记加上时间了, 如何创建索引成为问题 mysql可以使用 pt-online-schema-change sqlserver企业版支持无锁加索引, 但是我
用的是标准版, 所以我使用了2的方式,先建一个临时表, 并建上索引, 批量通过历史数据, 插入到临时表, 然后交换表的名称, 这样就不会影响业务了
数据库分库分表学习
- 垂直分表, 把一个大表的字段拆分成多个小表
- 水平分表, 把一个大表的数据按照某种规则分散到不同的表中
- 分库分表, 把数据库按照业务模块分开, 比如用户信息, 产品信息等, 然后每个库再根据数据量进行水平分表
- 分库分表的好处是提高查询效率, 提高并发能力, 但是会增加维护成本
- 分库分表的原则是尽量保持数据的完整性, 比如用户信息和订单信息不应该放在同一个库中
- 分库分表需要考虑的问题有: 如何确定分库分表的键值, 如何处理跨库的关联查询, 如何保证数据的唯一性, 如何处理分布式事务
- 分库分表的工具主要有 sharding-jdbc, mycat, kingshard 等
- 分库分表的最佳实践是先垂直分表, 再水平分表, 最后考虑分库
- 分库分表的注意事项有: 尽量避免跨库的关联查询, 如果必须做的话, 可以使用全局表或者冗余的方式来解决; 尽量避免分布式事务, 如果必须做的话, 可以使
用最终一致性来解决问题; 尽量避免跨库的排序和分组
推荐Sharding-JDBC
Sharding-JDBC 是 Apache ShardingSphere 生态中最核心、最常用的轻量级分库分表 + 读写分离组件,定位为增强型 JDBC 驱动,无独立服务、无代码侵入,是 Java 生态分库分表的工业级标准方案。
