请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

想请教您,在flask中使用sqlalchemy对数据库(比如mysql)分库和分表的最佳实践怎么做?

您好,您提到flask sqlalchemy对数据库横向分片的支持,我看了sqlalchemy官方文档和示例代码,但还是不太理解该如何使用。

想请教您,在flask中使用sqlalchemy对数据库(比如mysql)分库和分表的最佳实践怎么做?

拜谢!

正在回答 回答被采纳积分+3

1回答

7七月 2019-06-05 01:09:43

我其实不建议水平切割用ORM,因为不太灵活。当遇到水平切割的时候最好使用原生的SQL自己来封装。它这个文档里我看了下,主要是bind和mapper这两个方法,它其实是在内部对水平表做了一个关联,具体的还需要实践,我也没有用Sqlalchemy做过这个水平切割,大数据量的场景以前都是用Java做的。Python我之前2个项目都是用的缓存来解决的性能问题。

0 回复 有任何疑惑可以回复我~
  • 提问者 null_386 #1
    感谢七月老师的解答,后面结合我的业务特点,决定使用分区的方式来解决。
    
    MySQL单表记录在1000万条以下可以获得较好的性能;
    
    预估的每个商户体量会比较大,所有商户数据放在一起,单表性能太差;
    
    单个商户订单预估的每月是900万条记录;
    
    使用关系型数据库,不使用nosql,因为交易类型的数据,需要使用事务来保证交易的完整性;nosql虽然具有良好的扩展性,但是事务的保证是弱点;
    
    按月分区的另外一个好处是,热点和活跃数据往往是最近几个月的数据,历史数据的查询频率非常低,历史月份的数据在后期清理和迁移也很方便,方便为主库腾出更多可用空间;
    
    另外flask以及其它使用ORM的框架来做分表,会大大增加代码的复杂度和维护成本。在ORM上也实现了分表的方案,也可以实现动态按月分表,最终没有采用,也是因为不想增加代码的维护成本和复杂度。把分表的工作交给mysql底层去处理。
    
    https://github.com/kevin386/flask-sharding-table/blob/master/demo.py
    另外我把不同领域产生的数据放到不同的库,暂时会考虑使用同一个实例,如果后期需要扩容再分实例,把不同领域的库按实例拆分出去。
    
    非常喜欢七月老师的课程讲解,非常有深度。希望有更多机会向七月老师请教和交流,留下QQ: 343469394
    回复 有任何疑惑可以回复我~ 2019-06-14 21:50:20
  • 提问者 null_386 #2
    另外对于交易类型的表,最近接触到一个叫 event sourcing 的东西,非常适合解决我目前业务的读写性能问题,用空间换时间。缓存和db可能会有同步问题,对于实时性不高,以及修改不频繁但查询频繁的数据,我也会考虑使用缓存。
    https://www.imooc.com/article/40858
    回复 有任何疑惑可以回复我~ 2019-06-14 22:02:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信