我有一个带有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查询,花费更少的时间?
如果有,怎么样?
答案 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中链接数据