mysql分表查询问题

问: mysql使用了分表,以订单表为例,我们使用了日期分的月表,order_202407,order_202408, 如果要查询 7.15-8.15的数据如何查询?
答: 1. 查到临时表,再处理的分页 2. 查出数据,程序逻辑处理

问题:除了这个方案,还有其他方式处理吗?特别是数据量比较大的时候?

_jue
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

找下 数据库中间件,可以解决这个问题

Apache ShardingSphere

mycat

and so on

8个月前 评论
jcleng 8个月前
kis龍 (作者) 8个月前
讨论数量: 17

分表的目的是将大容量的数据表分散到多个小表中,减少查询IO,有跨月份查询的需求,在做分表设计时就应该考虑到,不然你做月份分表的意义是什么呢?

  1. 设置一个主表,主表的数据可以存储最近6个月-12个月以内,历史数据迁移至备份分表,不允许查询超出时间范围内的数据,查询时间范围外的数据,按分表时间单独查询某个表。
  2. 月份分表,数据量不是很大的情况下,可以使用union all,但最好也不要超出2张以上的分表union,否则分表就无意义。
8个月前 评论

找下 数据库中间件,可以解决这个问题

Apache ShardingSphere

mycat

and so on

8个月前 评论
jcleng 8个月前
kis龍 (作者) 8个月前

使用union all?根据筛选条件计算出相关的表 再通过union all连起来

8个月前 评论
_jue (楼主) 8个月前

分表的目的是将大容量的数据表分散到多个小表中,减少查询IO,有跨月份查询的需求,在做分表设计时就应该考虑到,不然你做月份分表的意义是什么呢?

  1. 设置一个主表,主表的数据可以存储最近6个月-12个月以内,历史数据迁移至备份分表,不允许查询超出时间范围内的数据,查询时间范围外的数据,按分表时间单独查询某个表。
  2. 月份分表,数据量不是很大的情况下,可以使用union all,但最好也不要超出2张以上的分表union,否则分表就无意义。
8个月前 评论
chowjiawei

模型里面设置了分表逻辑后 可以直接查询不用特殊处理

8个月前 评论

选择 TiDB 或 OceanBase ,也是一种方案

8个月前 评论

这种分表就不应该还做跨表查询

8个月前 评论
_jue (楼主) 8个月前

理论上分表是因为数据过多导致大表的性能下降才会分表,那么在流程上就不会在提供快表查询功能,但是在业务上如果有需求是可以兼容处理的,无非就是

1.联表

2.存储一份指定时间内冗余数据,比如半年内,超过这个时间不在提供直观的查询

3.数据导入其他存储,比如es,提供查询

8个月前 评论

我印象中用中间件是不好处理分页的

8个月前 评论
sanders

我们用的分区,我记得分表可以用 merge 引擎进行合并查询。但一个查询扫多张表肯定慢,分区也一样,所以一般是要强制要求查询条件必须带上分表用的字段。分页也最好是用游标方式(即:select * from orders where id < '$yourPrevPageLastID' order by id desc limit 100)。

8个月前 评论

问:项目规模是怎样的,数据量有多少,要考虑分表,能不能不分表?

8个月前 评论
_jue (楼主) 8个月前
寞小陌 8个月前

如果可以考虑其他中间件的话,把7月数据和8月数据写入elasticsearch,然后再从es中查询合并。

8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!