php - 比 join 更好的解决方案

标签 php mysql

我有一个 mySQL 查询,它连接了 11 个表,每个表中大约有 50000 行,所有这些表都通过所有表中通用的序列号链接
虽然我只想要每个序列号一行,但 mySQL 需要很长时间才能运行查询,因为它必须连接如此多的表和如此多的行
我相信它必须创造大约 50000^11(11 的幂)

示例:(示例查询在语法上可能不正确,但我希望您明白)

select distinct serial, one.data1,two.data2,three.data3 from list 
left join (select * from table1)  as one on list.serial=one.serial 
left join (select * from table2)  as two on list.serial=two.serial 
left join (select * from table3)  as three on list.serial=three.serial 

连接更好还是子查询更好?
有没有更好的方法来构建花费更少时间的 sql 查询?
如果是,怎么办?

最佳答案

一种解决方案是创建并维护一个单独的索引表,其中包含您需要的数据点(例如序列、one.data1、two.data2、三.data3)。重新索引(查询和插入记录)此表会产生开销,但所有后续查询可以节省大量开销。

我发现另一个有用的解决方案是执行编程连接。当具有简单标准的多表连接需要太多内存时,可能会导致性能大幅下降。您应该尝试使用您正在使用的任何 native 编程语言(例如 PHP)对通过简单查询构建的数据集进行手动基准测试。有时您可能会使用此技术获得优势

关于php - 比 join 更好的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586039/

相关文章:

php - 一定指数后停止 explode

php - 如何使用 JSON 以外的方法将数组转换为字符串?

php - 将数组传递给 web 服务 php nusoap

mysql - 选择满足多个子句的 ID

mysql - 在 Azure 数据库中为 MySQL 创建 MyISAM 表是否启用?

python - 无法从 slack 打印用户名 "@John"以及如何在不手动输入 cntrl+c 的情况下关闭 Linux 中的 python 文件

php上传多个文件

mysql - 两个查询到一个有两列的表

php - 基于外键表列值的Mysql结果

php - 未处理的异常 : Redefining already defined constructor for class