Mysql SQL查询-内存过载
我有一个非常简单的SQL查询Mysql SQL查询-内存过载,mysql,Mysql,我有一个非常简单的SQL查询 SELECT v.*, u.user_company as company_name, o.`name` as object_name, o.address as object_address, i.id as installation_id, i.`name` as installation_name FROM maintenance as v, users as u,t_local as o, t_local_objects as i WHERE o.acti
SELECT v.*, u.user_company as company_name, o.`name` as object_name,
o.address as object_address, i.id as installation_id, i.`name`
as installation_name FROM maintenance as v, users as u,t_local as o,
t_local_objects as i WHERE o.active=1 AND v.done IS NOT NULL
最大的表-maintenance
,它有大约3k条记录,其他的大约有300条,这其实并不多。当我执行它时,我得到了一个内存过载(试图分配超过130MB)。如何优化查询
随着时间的推移,这些表将变得越来越大,因此它必须对
维护中超过10k条记录有效您可能正在寻找联接。顺便说一句,表中的3K行不是太多,而是太少了。加入表格,你的团队会很快得到结果
这样说:
SELECT v.*, u.user_company as company_name, o.`name` as object_name,
o.address as object_address, i.id as installation_id, i.`name`
as installation_name
FROM maintenance as v inner join users as u on v.id = u.id
.....
WHERE o.active=1 AND v.done IS NOT NULL
sql查询中有错误,您应该使用联接
你在哪里得到内存负载?
根据使用此查询的应用程序类型,您可以尝试:
1.如果是web或桌面应用程序,您可以尝试分页,例如,将记录限制在一个范围内
2.如果您在squirrel或sql Management studio之类的sql工具中运行,我建议您检查错误的来源,这是工具中的错误吗?您可以尝试设置一个存储的proc,该proc在一个范围内给出结果,如果不使用联接,您将隐式执行交叉联接。将每个表的每一行与每个其他表的每一行进行匹配,得到查询中每个表中条目数的总结果集,并相乘。维护有3k行,如果所有其他表都有1k行,那么结果中就有3k*1k*1k行,或者30亿行,这就是内存使用量