多表关联查询效率就很低,有没有只改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表,但是修改模型的话代价太大了)

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

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

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

tid 和 uid 上加索引

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

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

对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查询效率。