ThinkPHP处理大表数据合并,不使用UNION的解决方案?

php thinkphp mysql 两张表无关联关系
现在查询两张表的数据融合在一个列表里面查询,不使用union
一张数据表数据在千万,另一张数据表数据在百万

思路:
1,两张表的字段差距比较大,数据量比较大,牵扯多个接口,合并一张表耗时耗力
2,每张表各取一定量的数据,进行数据合并

各位大佬,还有其他的思路么

阅读 596
1 个回答

方案一:分表查询后程序合并

// 分别查询两张表
$table1Data = Db::name('table1')->limit(100)->select();
$table2Data = Db::name('table2')->limit(100)->select();

// 在PHP中合并数据
$mergedData = array_merge($table1Data->toArray(), $table2Data->toArray());

这种方案适合数据量不大且需要前端展示的场景

方案二:使用临时表或视图
1、创建临时表存储合并结果:

CREATE TEMPORARY TABLE temp_merged AS
SELECT * FROM table1 LIMIT 100000
UNION ALL
SELECT * FROM table2 LIMIT 100000;

2、然后在ThinkPHP中查询这个临时表

方案三:分页并行查询

// 并行查询两张表
$page = input('page', 1);
$size = input('size', 20);

$table1Data = Db::name('table1')
    ->page($page, $size/2)
    ->select();

$table2Data = Db::name('table2')
    ->page($page, $size/2)
    ->select();

// 合并结果
$result = array_merge($table1Data, $table2Data);

这种方案适合需要分页展示的场景

优化建议

1、索引优化‌:确保两张表的查询字段都有适当的索引

‌2、缓存结果‌:对合并后的结果进行缓存,减少重复查询

‌3、异步处理‌:对于大数据量可以考虑使用队列异步处理合并任务

‌4、字段映射‌:如果字段差异大,可以使用字段别名统一映射

‌5、数据分片‌:按时间或其他维度分片查询后再合并

对于千万级和百万级的大表,建议优先考虑分表查询后程序合并的方案,这样可以避免单次查询过大导致性能问题

扩展优化方案

‌1、动态分配‌:
1)根据两张表的数据量动态调整查询比例

2)例如数据量大的表分配更多查询条数

2、缓存策略‌:

1)对不常变动的表数据实施缓存

2)减少数据库查询压力

这种方案特别适合千万级和百万级大表合并分页场景,既能保证性能,又能提供良好的分页体验

推荐问题