比连接更好的解决方案

时间:2015-02-18 14:27:29

标签: php mysql

我有一个带有11个表的连接的mySQL查询,每个表中有大约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查询,花费更少的时间? 如果有,怎么样?

2 个答案:

答案 0 :(得分:0)

一种解决方案是创建和维护一个单独的索引表,该表包含您需要的数据点(例如,serial,one.data1,two.data2,three.data3)。重新索引(查询和插入记录)此表将导致开销,但所有后续查询都可以节省大量开销。

我发现另一个有用的解决方案是执行程序连接。当具有简单标准的多表连接需要太多内存时,可能会出现大量性能下降。您应该尝试使用您正在使用的任何本机编程语言(例如PHP)手动加入从简单查询构建的数据集的基准测试。有时你可能会使用这种技术获得优势

答案 1 :(得分:0)

  • 包含表外键?

  • 不要使用select *,而是使用连接表

也许:

SELECT serial, table1.data1,table2.data2,table3.data3 FROM list
LEFT JOIN table1 USING serial
LEFT JOIN table2 USING serial
LEFT JOIN table3 USING serial
GROUP BY list.serial
  • 创建密钥

可能单独处理查询并在PHP中链接数据