多表关联查询效率就很低,有没有只改SQL的优化方案?

简化模型如下:
[code="sql"]
select * from t,ut,u
where t.tid = ut.tid
and ut.uid = u.uid
[/code]
其中t表和ut表的数据量都在300W的样子,u表的数据量200条左右
查询时间在10秒左右

有没有什么好的优化方案?只从数据库这一层来做优化的
(历史原因:任SB设计人员非要搞了一个中间表ut,实际上在t表中多搞一个uid的字段就好了,然后可以废除ut表,但是修改模型的话代价太大了)

ak121077313
ak121077313 300W 不算多,查询应该2 3秒的事情 你的联表查询sql 也写错了 下面给出了正确的sql 如果想要保持现状 就得加索引之类的优化方法了
7 年多之前 回复

10个回答

一下子查询出来这么多数据时间当然久了,试着查询出100条记录试试,如果时间仍然比较久,可以考虑触发器:新建一张表,存三张表所有的字段,ut新增时的触发器往新表插入数据,删除的时候删除新表数据,t表和u表修改的时候修改新表,查询的时候查询新表(只改查询sql),其他增删改逻辑都不变。

yeluochengshang
yeluochengshang 目前已经想到几种解决方案了,个人感觉最好的一种方案这里我说下:由于U和T之间是1对多的关系,考虑去除中间表UT,然后把T表中的一个值全部是null的字段变化成为UID,这样在查询的时候就只需要关联2张表了
7 年多之前 回复

select * from t join ut on t.tid = ut.tid join u on ut.uid = u.uid
试试这个.

yeluochengshang
yeluochengshang 执行了下,效率无任何变化
7 年多之前 回复
hejiaqi789
hejiaqi789 或 select * from u left join ut on u.uid = ut.uid left join t on ut.tid = t.tid
7 年多之前 回复

你们数据库设计应该是这两张表的关系是多对多的,不然中间表应该没必要。说了句废话我。。。对答案没什么帮助

wsgopk
wsgopk 哈哈哈 苦了你了
7 年多之前 回复
yeluochengshang
yeluochengshang u和t是一对多的关系,所以我才说前任开发人员SB
7 年多之前 回复

tid 和 uid 上加索引

yeluochengshang
yeluochengshang 星期一上班真晕,评论错人了...by the way id都是有索引的
7 年多之前 回复
yeluochengshang
yeluochengshang t和U是多对1的
7 年多之前 回复

最简单的优化 就是减少连表的数量 实际上就是减少了嵌套循环查询的层次 即降低了时间复杂度

可以考虑 3条sql/2条sql 减少嵌套

jinnianshilongnian
jinnianshilongnian 减少 连表的深度
7 年多之前 回复
rrxiaoxiaotiankong
rrxiaoxiaotiankong 请教一下,3条sql/2条sql 是什么意思啊
7 年多之前 回复

对tid 和 uid 上加索引的说法是比较支持的。而且如果不需要全部字段,把到具体的字段代替*

如果不是业务需要查询所有记录,尽量少使用select *,这样可以降低io。
上面这个查询由于没有过滤数据,应该都是走的全表扫描。建议增加过滤条件,并对id字段加索引。

1、减少表嵌套,只列出需要的查询字段
2、给要创建的表主键加上索引

3、第三个就是“zyn010101”说的,创建一个新表

首先查看SQL的执行计划。看看能优化什么地方,一般是添加索引。

给tid和uid加上索引,并且改变sql为select * from t,ut,u where ut.uid = u.uid and t.tid = ut.tid。因为t表和ut表的数据量都在300W的样子,u表的数据量200条左右。所以先上u表和ut表关联减少联合查询记录数,最后再和t表关联,查询速度就快了。多表连接条件先后顺序也影响sql查询效率。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐